Redis主要支持的数据类型总共有5种:
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
"1x00x00x00x00hello"
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"