string (字符串)
是一种键值对的数据结构,定义一个唯一的key值来获取相应的value数据。
> set name codehole OK > get name "codehole" > exists name (integer) 1 > del name (integer) 1 > get name (nil) 批量操作 > set name1 codehole OK > set name2 holycoder OK > mget name1 name2 name3 # 返回一个列表 1) "codehole" 2) "holycoder" 3) (nil) > mset name1 boy name2 girl name3 unknown > mget name1 name2 name3 1) "boy" 2) "girl" 3) "unknown"
可以对 key 设置过期时间,到点自动删除,这个功能常用来控制缓存的失效时间。
> set name codehole > get name "codehole" > expire name 5 # 5s 后过期 ... # wait for 5s > get name (nil) > setex name 5 codehole # 5s 后过期,等价于 set+expire > get name "codehole" ... # wait for 5s > get name (nil) > setnx name codehole # 如果 name 不存在就执行 set 创建 (integer) 1 > get name "codehole" > setnx name holycoder (integer) 0 # 因为 name 已经存在,所以 set 创建不成功 > get name "codehole" # 没有改变
如果 value 值是一个整数,还可以对它进行自增操作
> set age 30 OK > incr age (integer) 31 > incrby age 5 (integer) 36 > incrby age -5 (integer) 31
list(列表)
相当于java里面的LinkedLis,意味着list的插入和删除非常快,但是索引定位很慢。
右边进左边出:队列
> rpush books python java golang (integer) 3 > llen books (integer) 3 > lpop books "python" > lpop books "java" > lpop books "golang" > lpop books (nil)
右边进右边出:栈
> rpush books python java golang (integer) 3 > rpop books "golang" > rpop books "java" > rpop books "python" > rpop books (nil)
lindex,lrange,ltrim
lindex相当于java链表的get(int index)方法,性能随着参数index增大而变差
lrange是获取范围内的数据
ltrim是保留这个list范围里面的数据,范围外的丢弃
> rpush books python java golang (integer) 3 > lindex books 1 # O(n) 慎用 "java" > lrange books 0 -1 # 获取所有元素,O(n) 慎用 1) "python" 2) "java" 3) "golang" > ltrim books 1 -1 # O(n) 慎用 OK > lrange books 0 -1 1) "java" 2) "golang" > ltrim books 1 0 # 这其实是清空了整个列表,因为区间范围长度为负 OK > llen books (integer) 0
hash(字典)
这个数据结构相当于java里面的HashMap,它是无序的。内部实现是使用了数组+链表二维结构。如果发生hash碰撞的时候,就会将碰撞的元素使用链表串接起来。并且redis的字典的vlaue值只能是字符串。
redis的字典在rehash的时候采用了渐进式策略,在rehash同时,会保留两个新旧hash结构,查询时会同时查询两个hash结构,然后再后续的定时任务中以及hash操作指令中,循序渐进地将旧 hash 的内容一点点迁移到新的 hash 结构中。当搬迁完成了,就会使用新的hash结构取而代之。
> hset books java "think in java" # 命令行的字符串如果包含空格,要用引号括起来 (integer) 1 > hset books golang "concurrency in go" (integer) 1 > hset books python "python cookbook" (integer) 1 > hgetall books # entries(),key 和 value 间隔出现 1) "java" 2) "think in java" 3) "golang" 4) "concurrency in go" 5) "python" 6) "python cookbook" > hlen books (integer) 3 > hget books java "think in java" > hset books golang "learning go programming" # 因为是更新操作,所以返回 0 (integer) 0 > hget books golang "learning go programming" > hmset books java "effective java" python "learning python" golang "modern golang programming" # 批量 set OK
set (集合)
它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值NULL。
> sadd books python (integer) 1 > sadd books python # 重复 (integer) 0 > sadd books java golang (integer) 2 > smembers books # 注意顺序,和插入的并不一致,因为 set 是无序的 1) "java" 2) "python" 3) "golang" > sismember books java # 查询某个 value 是否存在,相当于 contains(o) (integer) 1 > sismember books rust (integer) 0 > scard books # 获取长度相当于 count() (integer) 3 > spop books # 弹出一个 "java"
zset (有序集合)
一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。它的内部实现用的是一种叫做「跳跃列表」的数据结构。
> zadd books 9.0 "think in java" (integer) 1 > zadd books 8.9 "java concurrency" (integer) 1 > zadd books 8.6 "java cookbook" (integer) 1 > zrange books 0 -1 # 按 score 排序列出,参数区间为排名范围 1) "java cookbook" 2) "java concurrency" 3) "think in java" > zrevrange books 0 -1 # 按 score 逆序列出,参数区间为排名范围 1) "think in java" 2) "java concurrency" 3) "java cookbook" > zcard books # 相当于 count() (integer) 3 > zscore books "java concurrency" # 获取指定 value 的 score "8.9000000000000004" # 内部 score 使用 double 类型进行存储,所以存在小数点精度问题 > zrank books "java concurrency" # 排名 (integer) 1 > zrangebyscore books 0 8.91 # 根据分值区间遍历 zset 1) "java cookbook" 2) "java concurrency" > zrangebyscore books -inf 8.91 withscores # 根据分值区间 (-∞, 8.91] 遍历 zset,同时返回分值。inf 代表 infinite,无穷大的意思。 1) "java cookbook" 2) "8.5999999999999996" 3) "java concurrency" 4) "8.9000000000000004" > zrem books "java concurrency" # 删除 value (integer) 1 > zrange books 0 -1 1) "java cookbook" 2) "think in java"
来源:https://www.cnblogs.com/luozhiyun/p/10880722.html