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底层使用跳跃列表实现,具体的后续说明。

你可能感兴趣的:(数据结构,redis,java)