Redis 基础数据结构
String
动态字符串,类似arraylist,当字符串长度消息1M时,扩容是加倍现有空间,超过1M,扩容时会多扩1M空间,字符串长度最大为512M
redis-cli -h 172.31.1.135 -c -p 7000
使用set,get命令进行操作
判断key是否存在
exists key
删除key
del name
设置key的有效时间
set name codehole
expire name 5 # 5s 后过期
setex name 5 codehole # 5s 后过期,等价于 set+expire wait for 5 seconds get name
setnx name codehole # 如果 name 不存在就执行 set 创建
有返回值,返回值为1 表示创建成功 为0 创建失败
再次setnx命令,返回 0
setnx name java
使用redis进行计数
set age 30
incr age
还可以使用incrby 进行+/-计算
但是redis自增是有一定的范围的 signed long
set codehole 9223372036854775807
批量set get
mset name1 boy name2 girl name3 unknown
mget name1 name2 name3
如果不在一个slot上会报错的
列表
相当于java里面的linkedlist,链表的插入和删除非常快,复杂度O(1), 索引定位慢,时间复杂度为O(n)
使用场景
Redis 的列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理
右边进左边出:队列
rpush books python java golang
llen books #列表长度
lpop books #弹出列表第一个
右边进右边出:栈
rpush books python java golang
rpop books
Hash字典
相当于java中的hashmap,无序的,同样采用 数组+链表的二维结构,但是redis,扩容方式不一样, redis采用了渐进性rehash策略,新旧hash结构,循环渐进性的一点点迁移,当迁移完后,旧hash删除,内存回收
Redis和hashmap的扩容不有的地方是采用了渐进式hash,渐进性的一点点迁移
hash 移除了最后一个元素,数据结构会被删除
hash 结构的存储消耗要高于单个字符串
hset mapneme key value
hgetall mapname
hget mapname key
也有批量set
hmset books java "effective java" python "learning python" golang "modern golang programming"
set集合
相当于Java中的hashset,内部键值对是无序的唯一的,内部实现相当于一个特殊的字典,字典中所有value都是一个值NULL
sadd books python
sadd books java golang
smembers books
zset集合
java中sortedSet和HashMap的结合体,一方面是一个set,保证value的唯一性,另外一方面,可以给每个value赋值一个score,代码这个value的排序权重,内部实现是一个类似,跳跃列表的 数据结构
zset 可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注时间。我们可以对粉丝列表按关注时间进行排序。
zadd books 9.0 "think in java"
zadd books 8.9 "java concurrency"
zadd books 8.6 "java cookbook"
zrange books 0 -1 # 按 score 排序列出,参数区间为排名范围
zrevrange books 0 -1 # 按 score 逆序列出,参数区间为排名范围
跳跃列表其实采用的是一个二分查找的一个方式
我们需要这个链表按照 score 值进行排序。这意味着当有新元素需要插入时,要定位到特定位置的插入点,这样才可以继续保证链表是有序的。通常我们会通过二分查找来找到插入点,但是二分查找的对象必须是数组,只有数组才可以支持快速位置定位,链表做不到,那该怎么办? 想想一个创业公司,刚开始只有几个人,团队成员之间人人平等,都是联合创始人。随着公司的成长,人数渐渐变多,团队沟通成本随之增加。这时候就会引入组长制,对团队进行划分。每个团队会有一个组长。开会的时候分团队进行,多个组长之间还会有自己的会议安排。公司规模进一步扩展,需要再增加一个层级 —— 部门,每个部门会从组长列表中推选出一个代表来作为部长。部长们之间还会有自己的高层会议安排。
过期时间
ttl 可以查看key的过期时间