当前位置: 首页 > article >正文

redis 基础数据结构

string 字符串

redis的字符串是动态字符串,可以修改,底层是类似于Java的arrayList 。包含capacity (容量长度)和len(实际字符长度)。

当长度大于capacity时,会进行扩容,当字符串长度小于1MB时,加倍现有的空间扩容;超过1MB时,一次多扩1MB。最大长度为 512MB.。

操作命令

单个操作

127.0.0.1:6379> set name li
OK
127.0.0.1:6379> get name
"li"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
 

批量操作

127.0.0.1:6379> mset name1 zhao name2 qian name3 sun
OK
127.0.0.1:6379> mget name1 name2 name3
1) "zhao"
2) "qian"
3) "sun"

设置过期时间

name  10秒后过期

127.0.0.1:6379> expire name 10
(integer) 1

设置name为xiao 10秒过期

127.0.0.1:6379> setex name 10 xiao
OK

计数

计数的key不存在时,会自动创建。范围在signed long的最大值和最小值之间,超出会报错。

每次加1

127.0.0.1:6379> incr count
(integer) 1
127.0.0.1:6379> incr count
(integer) 2

每次加指定的

127.0.0.1:6379> incrby count 6
(integer) 8
127.0.0.1:6379> incrby count 3
(integer) 11

list 列表

相当于java里面的LinkedList,是链表,每个元素使用双向指针。

key不存在时会自动创建,元素为空时会自动删除。

当成队列操作

127.0.0.1:6379> lpop line
"1"
127.0.0.1:6379> lpop line
"2"
127.0.0.1:6379> lpop line
"3"
127.0.0.1:6379> lpop line
"4"
127.0.0.1:6379> lpop line
"5"
127.0.0.1:6379> lpop line
(nil)
127.0.0.1:6379> rpush line 1
(integer) 1
127.0.0.1:6379> rpush line 2
(integer) 2
127.0.0.1:6379> rpush line 3
(integer) 3

作为栈操作

127.0.0.1:6379> rpush stack 1
(integer) 1
127.0.0.1:6379> rpush stack 2
(integer) 2
127.0.0.1:6379> rpush stack 3
(integer) 3
127.0.0.1:6379> rpop stack
"3"
127.0.0.1:6379> rpop stack
"2"
127.0.0.1:6379> rpop stack
"1"

耗时较长的操作

lindex 相当于链表的get(index),需要遍历链表获取。

ltrim key start_index end_index    保留集合start_index到end_index之间的值。

lrange  key start_index end_index 获取指定范围的值。

下标index 可以是负数,代表倒数。-1 倒数第一个,-2倒数第二个,依次类推。

127.0.0.1:6379> rpush line 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> lrange line 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> ltrim line 2 3
OK
127.0.0.1:6379> lrange line 0 -1
1) "3"
2) "4"

redis的list底层使用了压缩列表和快速链表。这两种结构后续会详细说明。

hash 字典

字典相当于java中的HashMap。字典的value值,只能是字符串。redis字典的rehash使用了渐进式策略,后续会详细说明。

操作命令

127.0.0.1:6379> hset user name li
(integer) 1
127.0.0.1:6379> hset user age 23
(integer) 1
127.0.0.1:6379> hset user sex 1
(integer) 1
127.0.0.1:6379> hlen user
(integer) 3
127.0.0.1:6379> hget user name
"li"
127.0.0.1:6379> hgetall user
1) "name"
2) "li"
3) "age"
4) "23"
5) "sex"
6) "1"
127.0.0.1:6379> hmset user number 002 core 98
OK
127.0.0.1:6379> hgetall user
 1) "name"
 2) "li"
 3) "age"
 4) "23"
 5) "sex"
 6) "1"
 7) "number"
 8) "002"
 9) "core"
10) "98"

 hash结构的单个key计数

127.0.0.1:6379> hincrby user count 1
(integer) 1
127.0.0.1:6379> hincrby user count 4
(integer) 5

set 集合

相当于java里面的HashSet,所有的value是NULL。内部元素是无序的。

添加元素时,key不存在会直接创建。集合元素为空会自动删除key.

127.0.0.1:6379> sadd set a b c c
(integer) 3
127.0.0.1:6379> smembers set
1) "b"
2) "a"
3) "c"

判断元素是否存在
127.0.0.1:6379> sismember set d
(integer) 0
127.0.0.1:6379> sismember set a
(integer) 1

获取集合长度
127.0.0.1:6379> scard set
(integer) 3

弹出一个元素
127.0.0.1:6379> spop set
"b"

zset 有序列表

类似于java中Sorted和HashMap的结合体。

添加元素时,key不存在会直接创建。集合元素为空会自动删除key。

127.0.0.1:6379> zadd score 3 li 8 zhao 9 ming
(integer) 3
127.0.0.1:6379> zadd score 6 kai
(integer) 1
127.0.0.1:6379> zrange score 0 -1
1) "li"
2) "kai"
3) "zhao"
4) "ming"
127.0.0.1:6379> zrevrange score 0 -1
1) "ming"
2) "zhao"
3) "kai"
4) "li"
127.0.0.1:6379> zcard score
(integer) 4
127.0.0.1:6379> zscore score kai
"6"
127.0.0.1:6379> zrank score kai
(integer) 1

删除元素

127.0.0.1:6379> zrem score li
(integer) 1

zset底层使用跳跃列表实现,具体的后续说明。


http://www.kler.cn/news/9467.html

相关文章:

  • 基于多种算法实现鸢尾花聚类
  • Spark SQL实战(04)-API编程之DataFrame
  • 最新阿里、腾讯、华为、字节等大厂的薪资和职级对比,看看你差了多少...
  • 企业工程项目管理系统源码+java版本+项目模块功能清单+spring cloud +spring boot
  • 打开 plist 文件
  • 因薪资低拒绝offer,HR恼羞成怒,网友瞬间炸翻了..
  • Numpy基础用法
  • Android中的接口回调机制
  • 时光煮雨,岁月缝花
  • 两亲性聚合物Stearic acid PEG acid,STA-PEG-acid,硬脂酸聚乙二醇羧酸
  • LAMP架构的配置
  • Flink CDC 自定义反序列化
  • java 合作社交易系统Myeclipse开发mysql数据库mvc结构serlvet编程计算机网页项目
  • 多维时序 | MATLAB实现GRU门控循环单元多变量时间序列预测(多指标评价)
  • 【大数据开发运维解决方案】ssh: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b问题解决过程
  • 【Java面试八股文宝典之RabbitMQ篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day17
  • QT桌面的构建
  • es6和commonJs的区别
  • 医院设备管理的数字化转型:二维码巡检系统的实施与应用
  • 【Java数据结构】线性表-顺序表
  • gopls有没有什么很强大但是默认不开启的功能?
  • cursor.execute 执行两个结果并存储给变量
  • 【c语言】二维数组
  • SpringBoot案例
  • 从零开始学架构——高性能缓存架构
  • 【前端面试专题】【5】Vue3
  • sqlmap使用(以sqli-lab为例)
  • 【Leetcode之路 | Java Python】两数之和(暴力枚举哈希表)
  • 基于发票增值税OCR API设计自动识别应用系统,从此解放财务双手
  • 【图像分割】Segment Anything(Meta AI)论文解读