5 种基础数据结构,分别为:
string (字符串)、
最基本常见的, 用来缓存,
二进制安全的 就是 value 可以是复杂对象, 序列化存 序列化取 可以放图片
可批量读写,可设过期删除,可自增操作
set count 1
get count
incr count
get count
用户访问次数
incr usrId180903
hash (哈希)
特别适合存对象
hmset lilei name "LiLei" age 26 title "Senior"
hget lilei age
hget lilei title
hset lilei title "a"
和string的区别在于, 它的key下面还有一层key
例如,如果都拿来做用户缓存, string就缓存整个用户对象,hash 可以精确到每个字段
相当于 Java 语言里面的 HashMap,它是无序字典。内部实现结构上同 Java 的 HashMap 也是一致的,同样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。
和HashMap不同的是不是一次性的rehash ,而是 渐进的 保留新旧两个 hash 结构,查询时会同时查询两个 hash 结构,然后在后续的定时任务中以及 hash 操作指令中,循序渐进地将旧 hash 的内容一点点迁移到新的 hash 结构中。当搬迁完成了,就会使用新的hash结构取而代之。
list (列表)
相当于 Java 语言里面的 LinkedList,
增删快, 索引定位很慢,时间复杂度为 O(n),
弹出了最后一个元素之后,自动被删除
可左出右出(队列,栈都可以)
lpush mylist aaa
lpush mylist bbb
lpush mylist ccc
lrange mylist 0 10
1) "ccc"
2) "bbb"
3) "aaa"
ltrim 截取
做异步队列使用。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理。
可做最新消息排行榜
set (集合)
相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值NULL。
sadd myset 111
1
sadd myset 222
1
sadd myset 333
1
sadd myset 222
0
smembers myset
1) "111"
2) "222"
3) "333"
可以用来存储活动中奖的用户 ID,因为有去重功能,可以保证同一个用户不会中奖两次。
用来存关注人, 可以求交集并集
zset (有序集合)
一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重(从小到大
v不能重复, score可重复
zadd myzset 3 c
1
zadd myzset 1 d
1
zadd myzset 1 b
1
zadd myzset 9 b
0
zrangebyscore myzset 0 10
1) "d"
2) "b"
3) "c"
可以用来存储学生的成绩,value 值是学生的 ID,score 是他的考试成绩。
做工作队列, 优先级高的任务 优先执行
zset 要支持随机的插入和删除,只能用链表,
这个链表按照 score 值进行排序, 新的数据插入的时候,也要保持这个顺序,得快速找到位置
定位插入点时,先在最高层查找,然后下潜到下一级定位,一直下潜到最底层找到合适的位置,将新元素插进去。
至于哪个数据 能放入下一层 是:
L1 层只有 50% 的概率,L2 层只有 25% 的概率,L3 层只有 12.5% 的概率,一直随机到最顶层 L31 层。
这样就是不知道最终由多长的链表, 也能得到合适的层数和分布
其他
HyperLog Log 计数的
Geo 地理位置