Redis数据结构

Redis主要支持的数据类型总共有5种:

toc

String字符串类型

字符串是Redis的一种最基本的类型。Redis字符串具有二进制安全功能,主要是指二级制文件上执行的不更改文件内容的功能或者操作,把操作数据作为原始的。无任何特殊格式意义的数据流进行存储,字符串、数字、存储图片、json、或者web的css等静态文件。当然这个值也是用限制的,最大值不能超过512M。

创建和获取

创建key值 SET,获取value值 GET
注意:key的name存在的话,则会覆盖

## 创建字符串
127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> set key2 world
OK
127.0.0.1:6379> set key3 songguoyou
OK
## 获取字符串
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> get key2
"world"
127.0.0.1:6379> get key3
"songguoyou"
127.0.0.1:6379> get key4
(nil)          ##(nil)代表没有值

批量创建和批量获取

批量创建key值 MSET,批量获取value值 MGET

## 批量创建字符串
127.0.0.1:6379> mset key4 song key5 guo key6 you
OK
## 批量获取字符串
127.0.0.1:6379> mget key1 key2 key3 key4 key5 key6
1) "hello"
2) "world"
3) "songguoyou"
4) "song"
5) "guo"
6) "you"

追加和删除

追加key值 APPEND,删除value值 DEL

## 追加内容
127.0.0.1:6379> append key1 world   
(integer) 10
127.0.0.1:6379> 
127.0.0.1:6379> get key1
"helloworld"
127.0.0.1:6379> append key1 world
(integer) 15
127.0.0.1:6379> get key1
"helloworldworld"
## 删除key
127.0.0.1:6379> del key1
(integer) 1
127.0.0.1:6379> get key1
(nil)

字符串int类型增加和减少(可以用于计数器)

## 创建int类型的value
127.0.0.1:6379> set key2 124
OK
127.0.0.1:6379> get key2
"124"
## 查看value类型
127.0.0.1:6379> object encoding key2
"int"
## 对key进行 +1的操作,非int64则会报错
127.0.0.1:6379> incr key2    #对key进行 +1的操作,非int64则会报错
(integer) 125
127.0.0.1:6379> get key2
"125"
 ## 对key进行 +N的操作
127.0.0.1:6379> incrby key2 10 
(integer) 135
127.0.0.1:6379> get key2
"135"
## 对key进行 -1的操作
127.0.0.1:6379> decr key2   
(integer) 134
127.0.0.1:6379> get key2
"134"
## 对key进行 -N的操作
127.0.0.1:6379> decrby key2 5
(integer) 129

过期时间的操作

## 创建key并制定过期时间单位秒 ex
127.0.0.1:6379> setex key1 10 hello  
OK
127.0.0.1:6379> get key1
“hello”
## 过期可以看到key返回为nil
127.0.0.1:6379> get key1    
(nil)
127.0.0.1:6379> get key2
"129"
## 过期时间单位毫秒 px
127.0.0.1:6379> set key1 hello px 10000  
OK
127.0.0.1:6379> get key1
(nil)
127.0.0.1:6379> set key1 hello ex 1000
OK
## 查看key的过期时间单位为秒 ttl
127.0.0.1:6379> ttl key1   
(integer) 996
127.0.0.1:6379> set key1 hello px 10000
OK
127.0.0.1:6379> 
127.0.0.1:6379> ttl key1
(integer) 8
127.0.0.1:6379> ttl key1
(integer) 5
127.0.0.1:6379> ttl key1

字符串替换和截取

注意:下标从0开始计算,0是第一位。

127.0.0.1:6379> set key1 hello
OK
## 从第5位开始替换,下标从0开始
127.0.0.1:6379> setrange key1 4 world  
(integer) 9
127.0.0.1:6379> get key1
"hellworld"

127.0.0.1:6379> set key1 1   
OK
## 从第6位开始替换,如果没有那么多位,使用\x00代替
127.0.0.1:6379> setrange hey1 5 hello 
(integer) 10
127.0.0.1:6379> get key1
"1\x00\x00\x00\x00hello"

127.0.0.1:6379> set key2 123456789
OK
## 从第2位到第6位,这里下标值是包含5的,所以第六位包含在内
127.0.0.1:6379> getrange key2 1 5   
"23456"
127.0.0.1:6379> getrange key2 1 1
"2"
## 下标的key内没有值的时候,出现空
127.0.0.1:6379> getrange key2 10 11
""
## 查看value长度,咱们这个key有9位
127.0.0.1:6379> strlen key2   
(integer) 9
127.0.0.1:6379> get key2
"123456789"

List列表类型

LPUSH 插入一个新元素到列表头部
RPUSH 插入一个新元素到列表尾部。

## rpush 在右侧插入一个值,这是第一个创建,不分左右
127.0.0.1:6379> rpush list1 1  
(integer) 1
## 在1值的后边插入2
127.0.0.1:6379> rpush list1 2
(integer) 2
127.0.0.1:6379> rpush list1 3
(integer) 3            ## 这里返回表示list内有多少元素
127.0.0.1:6379> rpush list1 4
(integer) 4
## lrange 获取list下标0到1
127.0.0.1:6379> lrange list1 0 1  
1)  "1"
2)  "2"
 ## 获取下标0到0
127.0.0.1:6379> lrange list1 0 0  
1)  "1"
 #lindex命令 获取单个list内单个下标数据
127.0.0.1:6379> lindex list1 0 
"1"
127.0.0.1:6379> lindex list1 2
"3"
127.0.0.1:6379> lindex list1 1
"2"
 ## lrange 获取list下标0到-1(-1代表最后一个,所以这里会取出全部)
127.0.0.1:6379> lrange list1 0 -1 
1)  "1"
2)  "2"
3)  "3"
4)  "4"
## lpush命令 在list左侧,插入一个值
127.0.0.1:6379> lpush list1 5  
(integer) 5
127.0.0.1:6379> lrange list1 0 -1
1)  "5"
2)  "1"
3)  "2"
4)  "3"
5)  "4"
## linsert命令,支持在某个值的前边,或者后边插入一个值(不是下标),after是后边,before是前边。
127.0.0.1:6379> linsert list1 after 2 6  
(integer) 6
127.0.0.1:6379> lrange list1 0 -1
1)  "5"
2)  "1"
3)  "2"
4)  "6" 
5)  "3"
6)  "4"
127.0.0.1:6379> lpush list1 a
(integer) 7
127.0.0.1:6379> lrange list1 0 -1
1)  "a"
2)  "5"
3)  "1"
4)  "2"
5)  "6"
6)  "3"
7)  "4"
127.0.0.1:6379> linsert list1 after a 7
(integer) 8
## 如果list内没有b这个值的时候,返回-1,表示插入失败
127.0.0.1:6379> linsert list1 after b 7  
(integer) -1
127.0.0.1:6379> lrange list1 0 -1
1)  "a"
2)  "7"
3)  "5"
4)  "1"
5)  "2"
6)  "6"
7)  "3"
8)  "4"
## before 这里的是在5之前插入8,同样是list内的值。
127.0.0.1:6379> linsert list1 before 5 8
(integer) 9
127.0.0.1:6379> lrange list1 0 -1
1)  "a"
2)  "7"
3)  "8"
4)  "5"
5)  "1"
6)  "2"
7)  "6"
8)  "3"
9)  "4"
## lpop 从左侧移除一个元素
127.0.0.1:6379> lpop list1   
"a"
127.0.0.1:6379> lrange list1 0 -1
1)  "7"
2)  "8"
3)  "5"
4)  "1"
5)  "2"
6)  "6"
7)  "3"
8)  "4"
## rpop 从右侧移除一个元素
127.0.0.1:6379> rpop list1   
“4”
127.0.0.1:6379> lrange list1 0 -1
1)  "7"
2)  "8"
3)  "5"
4)  "1"
5)  "2"
6)  "6"
7)  "3"
## ltrim 保留下标1到3其余删除
127.0.0.1:6379> ltrim list1 1 3
OK
127.0.0.1:6379> lrange list1 0 -1
1)  "8"
2)  "5"
3)  "1"
 ## llen 列表长度
127.0.0.1:6379> llen list1
(integer) 3
## lset 替换下标1的元素
127.0.0.1:6379> lset list1 1 hello  
OK
127.0.0.1:6379> lrange list1 0 -1
1)  "8"
2)  "hello"
3)  "1"
127.0.0.1:6379> rpush list2 a
(integer) 1
127.0.0.1:6379> rpush list2 b
(integer) 2
127.0.0.1:6379> rpush list2 c
(integer) 3
127.0.0.1:6379> rpush list2 d
(integer) 4
## 可以一次插入多个元素
127.0.0.1:6379> rpush list2 e f g  
(integer) 7
127.0.0.1:6379> lrange list2 0 -1
1)  "a"
2)  "b"
3)  "c"
4)  "d"
5)  "e"
6)  "f"
7)  "g"
127.0.0.1:6379> lrange list1 0 -1
1)  "8"
2)  "hello"
3)  "1"
## rpoplpush 把list1的最后一个元素,插入到list2的最前边。
127.0.0.1:6379> rpoplpush list1 list2
"1"
127.0.0.1:6379> lrange list1 0 -1
1)  "8"
2)  "hello"
127.0.0.1:6379> lrange list2 0 -1
1)  "1"
2)  "a"
3)  "b"
4)  "c"
5)  "d"
6)  "e"
7)  "f"
8)  "g"

Sets 集合的操作

在Redis中Set和list都是字符串的集合。但是Set是无序的集合。集合中的元素都是唯一的。主要原因在于set集合中使用hash来保持了元素的唯一性。

## 创建并增加1个元素
127.0.0.1:6379> sadd set1 1
(integer) 1
## 支持增加一个或者多个元素
127.0.0.1:6379> sadd set1 2 3 4 5 
(integer) 4
## 查看集合中所有元素
127.0.0.1:6379> smembers set1
1)  "1"
2)  "2"
3)  "3"
4)  "4"
5)  "5"
## 查看值是否在集合中,在返回1
127.0.0.1:6379> sismember set1 3   
(integer) 1
## 查看元素是否在集合中,不存在返回0
127.0.0.1:6379> sismember set1 6   
(integer) 0
127.0.0.1:6379> 
127.0.0.1:6379> sadd set1 a b c d
(integer) 4
## 删除某个元素
127.0.0.1:6379> srem set1 2    
(integer) 1
127.0.0.1:6379> srem set1 a
(integer) 1
 ## 同时删除多个元素
127.0.0.1:6379> srem set1 b 4  
(integer) 2
## 查看所有元素
127.0.0.1:6379> smembers set1   
1)  "3"
2)  "5"
3)  "d"
4)  "1"
5)  "c"
127.0.0.1:6379> sadd set1 1
(integer) 0
127.0.0.1:6379> smembers set1
1)  "3"
2)  "5"
3)  "d"
4)  "1"
5)  "c"
127.0.0.1:6379> sadd set1 2
(integer) 1
127.0.0.1:6379> sadd set1 1 2 3
(integer) 0
127.0.0.1:6379> smembers set1
1)  "3"
2)  "5"
3)  "d"
4)  "2"
5)  "1"
6)  "c"
 ## 查询集合中有多少元素
127.0.0.1:6379> scard set1  
(integer) 6
127.0.0.1:6379> scard set2
(integer) 0
## 随机获取一个元素
127.0.0.1:6379> srandmember set1
"d"
127.0.0.1:6379> srandmember set1
"3"
127.0.0.1:6379> srandmember set1
"2"

127.0.0.1:6379> sadd set2 1 2 3 4 5 6
(integer) 6
## 从set1中移除,存放到set2中。本次操作由于set2中有3这个值,所以set1中移除,由于唯一性set2中,还是保持只有一个3
127.0.0.1:6379> smove set1 set2 3   
(integer) 1
127.0.0.1:6379> members set1
1)  "5"
2)  "2"
3)  "d"
4)  "1"
5)  "c"
127.0.0.1:6379> members set2
1)  "1"
2)  "2"
3)  "3"
4)  "4"
5)  "5"
6)  "6"
v127.0.0.1:6379> smove set1 set2 d
(integer) 1
127.0.0.1:6379> members set1
1)  "5"
2)  "2"
3)  "1"
4)  "c"
127.0.0.1:6379> members set2
1)  "4"
2)  "3"
3)  "6"
4)  "5"
5)  "2"
6)  "1"
7)  "d"
 ## 查看两个set的合并及,唯一输出,不重复显示
127.0.0.1:6379> sunion set1 set2  
1)  "3"
2)  "4"
3)  "6"
4)  "5"
5)  "1"
6)  "2"
7)  "c"
8)  "d"
## 查看set1 set2的交集,共同拥有的值。
127.0.0.1:6379> sinter set1 set2  
1)  "5"
2)  "2"
3)  "1"
## 对比set1和set2差异(以set1为基准)
127.0.0.1:6379> sdiff set1 set2
1)  "c"
## 对比set2和set1差异(以set2为基准)
127.0.0.1:6379> sdiff set2 set1
1)  "4"
2)  "3"
3)  "d"
4)  "6"

Hash之操作

Redis中的字典采用哈希表作为底层实现,一个哈希表有多个节点,每个节点保存一个键值对。
就像python中的字典一样,里面可以存放许多键值对。

## 创建并插入单个值
127.0.0.1:6379> hset hash1 name ersha
(integer) 1
127.0.0.1:6379> hset hash1 age 25
(integer) 1
#获取hash表中键值为name的value
127.0.0.1:6379> hget hash1 name
"ersha"
## 原来已存在,插入则修改
127.0.0.1:6379> hset hash1 name dasha  
(integer) 0
127.0.0.1:6379> hget hash1 name
"dasha"
 ## 查看元素数量
127.0.0.1:6379> hlen hash1
(integer) 2
## 判断键name是否存在,真1假0
127.0.0.1:6379> hexists hash1 name
(integer) 1
127.0.0.1:6379> hexists hash1 sex
(integer) 0
127.0.0.1:6379> hset hash1 sex man
(integer) 1
127.0.0.1:6379> hset hash1 phone 12345678910
(integer) 1
127.0.0.1:6379> hset hash1 email dasha@qq.com
(integer) 1
127.0.0.1:6379> hget hash1 sex
"man"
## 删除1个或者多个键值
127.0.0.1:6379> hdel hash1 sex name
(integer) 2
127.0.0.1:6379> hget hash1 sex
(nil)
127.0.0.1:6379> hget hash1 name
(nil)
 ## 获取hash表内所有键和数
127.0.0.1:6379> hgetall hash1   
1)  "age"
2)  "25"
3)  "phone"
4)  "12345678910"
5)  "email"
6)  "dasha@qq.com"
## 插入多个键和数
127.0.0.1:6379> hmset hash1 name dasha sex man
OK
## 查看hash表中多个键值的value
127.0.0.1:6379> hmget hash1 name phone
1)  "dasha"
2)  "12345678910"
## 查看hash表中所有的key
127.0.0.1:6379> hkeys hash1
1)  "age"
2)  "phone"
3)  "email"
4)  "name"
5)  "sex"
 ## 查看hash表中所有value
127.0.0.1:6379> hvals hash1  
1)  "25"
2)  "12345678910"
3)  "dasha@qq.com"
4)  "dasha"
5)  "man"

Sorted Sets 有序集合

Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数(类似权重,可以重复)。redis正是通过分数来为集合中的成员进行从小到大的排序。

## 插入分支和数据。可以多个,一定要有权重
127.0.0.1:6379> zadd zset1 1 peiking
(integer) 1
127.0.0.1:6379> zadd aset1 2 shanghai
(integer) 1
127.0.0.1:6379> zadd zset1 3 guangzhou
(integer) 1
127.0.0.1:6379> zadd zset1 4 shenzhen
(integer) 1
127.0.0.1:6379> zadd zset1 5 tianjin
(integer) 1
## 值重复的返回 0 ,但分数会修改
127.0.0.1:6379> zadd zset1 6 tianjin
(integer) 0
127.0.0.1:6379> zadd zset1 7 tianjin
(integer) 0
## 按照权重,从小到大限制,0 -1都是下标,代表显示全部。
127.0.0.1:6379> zrange zset1 0 -1 withscores
 1) "peiking"
 2) "1"
 3) "shanghai"
 4) "2"
 5) "guangzhou"
 6) "3"
 7) "shenzhen"
 8) "4"
 9) "tianjin"
10) "7"
## 显示下标0到1的元素
127.0.0.1:6379> zrange zset1 0 1 withscores
 1) "peiking"
 2) "1"
 3) "shanghai"
 4) "2"
## 显示按照权重从大到小的全部显示。重点:0 -1代表全部
127.0.0.1:6379> zrevrange zset 0 -1 withscores
 1) "tianjin"
 2) "7"
 3) "shenzhen"
 4) "4"
 5) "guangzhou"
 6) "3"
 7) "shanghai"
 8) "2"
 9) "peiking"
10) "1"
## 统计集合中有多少元素
127.0.0.1:6379> zcard zset1
(integer) 5
## 统计权重1到5中间有多少元素
127.0.0.1:6379> zcount zset1 1 5
(integer) 4
## 为广州这个元素增加5个权重
127.0.0.1:6379> zincrby zset1 5 guangzhou
"8"
## 获取元素的索引(不算权重),下标从小到大排序
127.0.0.1:6379> zrank zset1 shanghai
(integer) 3
## 获取集合元素中shanghai的权重、分值
127.0.0.1:6379> zscore zset1 shanghai
"2"
## 获取元素的索引、下标从大到小排序
127.0.0.1:6379> zrevrank zset1 shanghai
(integer) 3
127.0.0.1:6379> zrevrange zset1 0 -1 withscores
 1) "guangzhou"
 2) "8"
 3) "tianjin"
 4) "7"
 5) "shenzhen"
 6) "4"
 7) "shanghai"
 8) "2"
 9) "peiking"
10) "1"
## 删除元素,多个用空格隔开
127.0.0.1:6379> zrem zset1 shenzhen shanghai
(integer) 2
127.0.0.1:6379> zrevrange zset1 0 -1 withscores
1) "guangzhou"
2) "8"
3) "tianjin"
4) "7"
5) "peiking"
6) "1"
## 按照索引删除区间(从小到大)
127.0.0.1:6379> zremrangebyrank zset1 2 3
(integer) 1
127.0.0.1:6379> zrevrange zset1 0 -1 withscores
3) "tianjin"
4) "7"
5) "peiking"
6) "1"
## 按照权重范围删除元素
127.0.0.1:6379> zremrangebyscore zset1 3 8
(integer) 1
127.0.0.1:6379> zrevrange zset1 0 -1 withscores
1)  "peiking"
2)  "1"

posted on 2019-11-18 18:28  云襄  阅读(142)  评论(0编辑  收藏  举报

导航