1.String类型
redis的字符串是动态字符串,内部结构类似ArrayList,采用预分配冗余空间来减少内存的频繁分配。
其内部的array的实际分配空间capacity一般要高于实际字符串的长度len
其常用命令如下:
1.set name value
2.get name
3.mset name1 value1 name2 value2 ...
4.get name1 name2
5.expire name 5 -> 设置name的过期时间为5s
6.setex name 5 value -> 等同于 set name 123 + expire name 5
7.setnx name value -> 如果name这个key不存在则创建,否则不创建
2.列表List
Redis的列表类似LinkedList,注意是双向链表。所以它的插入是O(1)的
当列表弹出最后一个元素后,该key就会被回收删除
命令:
rpush/lpush key value1 value2 value3
rpop/lpop key
llen key -> 获取列表的长度
以下操作由于链表的特点,是耗时操作
lindex key value -> 获取列表中value的index
ltrim key startIndex endIndex -> 删除两个index之外的value
lrange key startIndex endIndex -> 获取两个index之间的值
实际上,redis的列表采用的是一种快速链表的结构
- 如果元素较少,分配的是一块连续内存(zipList,类似数组)
- 当数据量比较多时才会改成快速链表
- quickList是将多个zipList串起来,使得省了多个pre和next指针变量
例子:
[1,2,3] -> [4,5,6] 一个pre和next指针
1 -> 2 -> 3 -> 4 -> 5 -> 6 多个pre和next指针
3.hash字典
类似HashMap,里面的key是无序的
redis的hash才用了渐进式rehash的操作:
1.在插入新元素时发现需要rehash
2.这个时候创建一个新的hash,但是并不将之前的hash全部rehash到新的hash中
3.在后续的定时任务以及hash操作指令中,循序渐进的将旧hash内容移动到新的hash中
4.当旧的hash最后一个元素被删除后,该结构就会被回收
命令:
hset key hashkey hashvalue
hget key hashkey
hgetall key -> 会以hashkey1 、hashvalue1、hashkey2、hashvalue2这样的方式显示出来
hmset hmget .....
hincrby key value incrNum
4.Set 集合
类似hashSet,内部key-value是无序的,每个key的value都是null
如果重复添加元素,后面的元素添加不进去
命令:
sadd key setkey
smembers key -> 查询set中所有的元素
5.zset
sortedSet + hashmap的结构,成为跳跃列表
命令:
zadd key score zsetkey
zrange books startIndex endIndex
zcard key -> 查询key中一共有多少个数据
zscore key zsetkey -> 查询score
zrank key zsetkey -> 查询某个元素的排名 1,2,3,...
6.redis通用规则
1. create if not exists: 如果某个key不存在,就创建,再将元素设置进去
2. drop if no elements: 如果某个key内的元素都被删除,那么这个key就会被删除
3. 过期时间
expire key 600 -> 10分钟过期
ttl key -> 查询key还有多久过期(如果已经过期会返回-1)