redis 基础数据结构
string 字符串
redis的字符串是动态字符串,可以修改,底层是类似于Java的arrayList 。包含capacity (容量长度)和len(实际字符长度)。
当长度大于capacity时,会进行扩容,当字符串长度小于1MB时,加倍现有的空间扩容;超过1MB时,一次多扩1MB。最大长度为 512MB.。
操作命令
单个操作
127.0.0.1:6379> set name li
OK
127.0.0.1:6379> get name
"li"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
批量操作
127.0.0.1:6379> mset name1 zhao name2 qian name3 sun
OK
127.0.0.1:6379> mget name1 name2 name3
1) "zhao"
2) "qian"
3) "sun"
设置过期时间
name 10秒后过期
127.0.0.1:6379> expire name 10
(integer) 1
设置name为xiao 10秒过期
127.0.0.1:6379> setex name 10 xiao
OK
计数
计数的key不存在时,会自动创建。范围在signed long的最大值和最小值之间,超出会报错。
每次加1
127.0.0.1:6379> incr count
(integer) 1
127.0.0.1:6379> incr count
(integer) 2
每次加指定的
127.0.0.1:6379> incrby count 6
(integer) 8
127.0.0.1:6379> incrby count 3
(integer) 11
list 列表
相当于java里面的LinkedList,是链表,每个元素使用双向指针。
key不存在时会自动创建,元素为空时会自动删除。
当成队列操作
127.0.0.1:6379> lpop line
"1"
127.0.0.1:6379> lpop line
"2"
127.0.0.1:6379> lpop line
"3"
127.0.0.1:6379> lpop line
"4"
127.0.0.1:6379> lpop line
"5"
127.0.0.1:6379> lpop line
(nil)
127.0.0.1:6379> rpush line 1
(integer) 1
127.0.0.1:6379> rpush line 2
(integer) 2
127.0.0.1:6379> rpush line 3
(integer) 3
作为栈操作
127.0.0.1:6379> rpush stack 1
(integer) 1
127.0.0.1:6379> rpush stack 2
(integer) 2
127.0.0.1:6379> rpush stack 3
(integer) 3
127.0.0.1:6379> rpop stack
"3"
127.0.0.1:6379> rpop stack
"2"
127.0.0.1:6379> rpop stack
"1"
耗时较长的操作
lindex 相当于链表的get(index),需要遍历链表获取。
ltrim key start_index end_index 保留集合start_index到end_index之间的值。
lrange key start_index end_index 获取指定范围的值。
下标index 可以是负数,代表倒数。-1 倒数第一个,-2倒数第二个,依次类推。
127.0.0.1:6379> rpush line 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> lrange line 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> ltrim line 2 3
OK
127.0.0.1:6379> lrange line 0 -1
1) "3"
2) "4"
redis的list底层使用了压缩列表和快速链表。这两种结构后续会详细说明。
hash 字典
字典相当于java中的HashMap。字典的value值,只能是字符串。redis字典的rehash使用了渐进式策略,后续会详细说明。
操作命令
127.0.0.1:6379> hset user name li
(integer) 1
127.0.0.1:6379> hset user age 23
(integer) 1
127.0.0.1:6379> hset user sex 1
(integer) 1
127.0.0.1:6379> hlen user
(integer) 3
127.0.0.1:6379> hget user name
"li"
127.0.0.1:6379> hgetall user
1) "name"
2) "li"
3) "age"
4) "23"
5) "sex"
6) "1"
127.0.0.1:6379> hmset user number 002 core 98
OK
127.0.0.1:6379> hgetall user
1) "name"
2) "li"
3) "age"
4) "23"
5) "sex"
6) "1"
7) "number"
8) "002"
9) "core"
10) "98"
hash结构的单个key计数
127.0.0.1:6379> hincrby user count 1
(integer) 1
127.0.0.1:6379> hincrby user count 4
(integer) 5
set 集合
相当于java里面的HashSet,所有的value是NULL。内部元素是无序的。
添加元素时,key不存在会直接创建。集合元素为空会自动删除key.
127.0.0.1:6379> sadd set a b c c
(integer) 3
127.0.0.1:6379> smembers set
1) "b"
2) "a"
3) "c"
判断元素是否存在
127.0.0.1:6379> sismember set d
(integer) 0
127.0.0.1:6379> sismember set a
(integer) 1
获取集合长度
127.0.0.1:6379> scard set
(integer) 3
弹出一个元素
127.0.0.1:6379> spop set
"b"
zset 有序列表
类似于java中Sorted和HashMap的结合体。
添加元素时,key不存在会直接创建。集合元素为空会自动删除key。
127.0.0.1:6379> zadd score 3 li 8 zhao 9 ming
(integer) 3
127.0.0.1:6379> zadd score 6 kai
(integer) 1
127.0.0.1:6379> zrange score 0 -1
1) "li"
2) "kai"
3) "zhao"
4) "ming"
127.0.0.1:6379> zrevrange score 0 -1
1) "ming"
2) "zhao"
3) "kai"
4) "li"
127.0.0.1:6379> zcard score
(integer) 4
127.0.0.1:6379> zscore score kai
"6"
127.0.0.1:6379> zrank score kai
(integer) 1
删除元素
127.0.0.1:6379> zrem score li
(integer) 1
zset底层使用跳跃列表实现,具体的后续说明。