redis所有的数据结构都以唯一的key字符串作为名称,然后通过这个key来获取value,不同的数据结构指的是value的结构不一样。
- String字符串结构
Redis的字符串是动态的字符串,可以修改。当字符串长度小于1MB时,扩容是加倍现有的空间。如果字符串长度超过1MB时,只会扩容1MB的空间,需要注意的是字符串的长度最大为512MB。
set name codehole
get name
exists name
del name
#批量键值对操作
set name1 codehole
set name2 holycoder
mget name1 name2 name3
#设置过期时间
setx name 5 codehole#5s过期
#计数
如果value是一个整数还可以自增
set age 30
incr age
incrby age 5
2 list 结构
Redis的列表相当于java的linkedList,列表中的每个元素都使用双向指针顺序,串起来可以支持前后遍历。常用来做异步队列使用。
#右边进左边出队列
#常用于消息排队和异步逻辑处理,确保元素的顺序
rpush books python java golang
lpop books
#右边进右边出 栈
rpush books python java golang
rpop books
#慢操作
rpush books python java golang
lindex books 1# java index可以为负数-1代表倒数第一个
lrange books 0 -1 #python java golang
ltrim books 1 -1 #两个参数定义了一个区间区间内的值保留
3 hash字典
redis的字典类似于java的HashMap,不同的是Redis字典的值只能是字符串,另外他们rehash的方式不一样。
jAVA的HashMap在字典很大时,rehash是一个耗时的操作,需要一次性全部rehash。Redis则采用了渐进式rehash策略。保留新旧两个hash结构,查询时同时查询两个hash结构,然后在后续的定时任务以及hash操作指令中,循序渐进的将旧hash的内容一点点迁移到新hash结构中,当hash移除了最后一个元素之后,该数据结构被自动删除,内存被回收。
hset books java "think in java"#命令行的字符串包含空格用引号引起来
hset books golang "concurrency in go"
hset books python "python cookbook"
hgetall books #key和value交替出现
hlen books #3
hget books java #"think in java"
hset books golang "leafring"#替换操作
hmset books java "effective java" python "learing python" #批量操作
#hash结构中单个的key也可以进行计数
hset user age 29
hincrby user age 1
4 set集合
Redis的集合相当于java的HashSet,内部的键值对是无序的,唯一的
sadd books python
sadd books python #重复
sadd books java golang
smembers books #插入次序和展示次序不一致
sismenbers books java #查询某个value是否存在
scard books #获取长度相当于coount()
spop books #弹出一个
5 zset有序列表
类似于JAVA的SortedSet和HashMap的结合体,一方面保证了value的唯一性,另一方面可以给每个value赋值一个score,代表这个value的排序权重。内部实现用的是一种“跳跃列表”的数据结构。
zadd books 9.0 "think in java"
zadd books 8.0 "java concurrery"
zadd books 7.0 "java cookbook"
zrange books 0 -1#按照score的得分由低到高列出
zrevrange books 0 -1 #按照score的得分高到低列出
zcard books #相当于count()
zscore books "java concurrery" # 获取指定value的score 8.9000000000004内部score使用double
zrank books "java concurrery" #排名
zrangebyscore books 0 8.91 #根据分值区间遍历zset
zrangebyscore books -inf 8.91 withscores #根据分值区间遍历zset同时返回分值
zrem books "java concurrery" #删除value
小结:
容器型数据结构的通用规则
list,set,hash,zset共享下面两条通用规则。
1 create if not exists
2 drop if no elements
过期时间
Redis的所有数据结构都是可以设置过期时间的,需要注意的是过期是以对象为单位,比如一个hash结构的
过期是整个hash对象的过期,而不是其中的一个子key的过期。
如果一个字符串设置了过期时间,然后你用set方法修改了它,他的过期时间也会消失。