【Redis】02 基本数据类型
文章目录
- String类型
- 简述
- 查看key值 keys
- 基本赋值取值 SET/GET/APPEND/STRLEN
- 递增递减 INCR、DECR
- 批量操作key值
- List列表类型
- lpush/lpop/lrange
- Set集合类型
- SADD/SCARD/SISMEMBER/SMEMBERS
- SPOP/SREM/**SRANDMEMBER**
- sinter/sunion/sdiff
- sunionstore/sinterstore/sdiffstore
- 总结
- Hash哈希类型
- HSET/HGET/HEXISTS/HLEN/HDEL
- HSETNX/HGETALL/HKEYS/HVALS/HMGET
- Zset有序集合类型
- ZAdd/Zcard/**ZCOUNT/ZREM···**
- 博客学习内容
String类型
简述
String字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制存储格式,在value中最大能保存的数据长度为512M;
大多数适用于的时候都是String类型:80%;
面试造飞机,实践做轮子;
查看key值 keys
keys *

del删除key值
127.0.0.1:6379> del key1
(integer) 1
127.0.0.1:6379> keys key1
(empty list or set)
127.0.0.1:6379> keys key2
1) "key2"
127.0.0.1:6379> del key2
(integer) 1
127.0.0.1:6379> keys key2
(empty list or set)
127.0.0.1:6379>
基本赋值取值 SET/GET/APPEND/STRLEN
- 赋值命令
set,使用set 对 key 进行赋 value;
set key value 时间复杂度 O(1);
如果key中有内容,就覆盖掉原来的值,返回OK
- 取值命令
get,使用get 对 key 的值 进行获取
get key ,时间复杂度 O(1)
使用get命令只能获取 String类型的内容,如果不是就会发生报错
- 获取并覆盖命令
GETSET
时间复杂度 O(1),getset key value
getset的设置该Key为指定的Value,同时返回该Key的原有值。
- 追加字段
appendkey value
在key的值后面再追加一个value
- 查询字段长度
strlen
strlen key 获取字段的长度,等同于C库里的strlen,返回integer类型数据
setnx key value判断key的值是否存在,如果为null 则设置数据

递增递减 INCR、DECR
- 递增数字
INCRkey
key存在的情况下 递增key,不存在会ncr之后其值为1

- 递减数字
DECRkey

- 增加指定的整数
INCRBY key increment - 减少指定的整数
DECRBY key decrement
127.0.0.1:6379> get inkey
"31"
127.0.0.1:6379> incrby inkey 3
(integer) 34
127.0.0.1:6379> decrby inkey 4
(integer) 30
127.0.0.1:6379> incr inkey
(integer) 31
127.0.0.1:6379> decr inkey
(integer) 30
127.0.0.1:6379>
批量操作key值
mset、mget、msetnx
- mset 批量插入数据
- mget 批量获取数据
- msetnx 批量使用 setnx关键字,如果批量中有一个为false 整体则会失败返回0
127.0.0.1:6379> mset key1 "hello" key2 "world"
OK
127.0.0.1:6379> mget key key2 mykey
1) (nil)
2) "world"
3) "hello world"
127.0.0.1:6379> mget key1 key2 mykey
1) "hello"
2) "world"
3) "hello world"
127.0.0.1:6379> msetnx key1 hello1 key2 world1 key3 "!"
(integer) 0
127.0.0.1:6379> mget key1 key2 key3
1) "hello"
2) "world"
3) (nil)
127.0.0.1:6379> msetnx key3 mm key4 ff
(integer) 1
127.0.0.1:6379> mget key3 key4
1) "mm"
2) "ff"
127.0.0.1:6379>
List列表类型
List类型列表是有序的,是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。
List中可以包含的最大元素数量是4294967295。
lpush/lpop/lrange
lpushkey value [插入]
自左侧 依次向list中添加数据;rpush 则是从右侧
lpopkey [弹出]
依次移除数据并显示剩下的内容,同push一样
lrange查看list的内容
查看指定的list内容,lrange list 0 -1 查询所有的内容
127.0.0.1:6379> lpush list aa1l
(integer) 3
127.0.0.1:6379> rpush list aa1r
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "a11"
3) "a1"
4) "aa1r"
127.0.0.1:6379>
LPUSHX命令 /RPUSHX命令
仅有当参数中指定的Key存在时,该命令才会在其所关联的List插入参数中给出的Value,否则将不会有任何操作发生。 L从头部插入,R从尾部插入

LLEN key获取列表中元素的个数LREM key count value删除列表中指定的值LSET key index value设置指定索引的元素值LINDEX key index获取指定索引的元素值LINSERT key BEFORE|AFTER pivot value向列表中插入元素
127.0.0.1:6379> llen list
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "aa2l"
2) "aa1l"
3) "a11"
4) "a1"
5) "aa1r"
127.0.0.1:6379> lrem list 1 a1
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "aa2l"
2) "aa1l"
3) "a11"
4) "aa1r"
127.0.0.1:6379> lrem list 1
(error) ERR wrong number of arguments for 'lrem' command
127.0.0.1:6379> lset list 1 aa1l
OK
127.0.0.1:6379> lrange list 0 -1
1) "aa2l"
2) "aa1l"
3) "a11"
4) "aa1r"
127.0.0.1:6379> lset list 0 aa1l
OK
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "aa1l"
3) "a11"
4) "aa1r"
127.0.0.1:6379> lrem list 1 aa1l
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "a11"
3) "aa1r"
127.0.0.1:6379> lindex list 1
"a11"
127.0.0.1:6379> lindex list 0
"aa1l"
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "a11"
3) "aa1r"
127.0.0.1:6379> linsert list after a11 a22
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "a11"
3) "a22"
4) "aa1r"
127.0.0.1:6379>
RPOPLPUSH source destination将元素从一个列表转到另一个列表
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "a11"
3) "a22"
4) "aa1r"
127.0.0.1:6379> rpoplpush list listr
"aa1r"
127.0.0.1:6379> lrange list 0 -1
1) "aa1l"
2) "a11"
3) "a22"
127.0.0.1:6379> lrange listr 0 -1
1) "aa1r"
127.0.0.1:6379>
Redis链表经常会被用于消息队列的服务,以完成多程序之间的消息交换。
一个应用程序正在执行LPUSH操作向链表中添加新的元素,我们通常将这样的程序称之为"生产者(Producer)",而
一个应用程序正在执行RPOP操作从链表中取出元素,我们称这样的程序为"消费者(Consumer)"。
如果此时,消费者程序在取出消息元素后立刻崩溃,由于该消息已经被取出且没有被正常处理,那么我们就可以认为该消息已经丢失,由此可能会导致业务数据丢失,或业务状态的不一致等现象的发生。
然而通过使用
RPOPLPUSH命令,消费者程序在从主消息队列中取出消息之后再将其插入到备份队列中,直到消费者程序完成正常的处理逻辑后再将该消息从备份队列中删除。同时我们还可以提供一个守护进程,当发现备份队列中的消息过期时,可以重新将其再放回到主消息队列中,以便其它的消费者程序继续处理。
Set集合类型
Set集合是无序的,Set集合中不允许出现重复的元素,List列表可以出现重复的数据;
SADD/SCARD/SISMEMBER/SMEMBERS
sadd添加数据,可以添加多个;scard统计数据‘sismemberkey 查找有没有这个数据,又返回 1 无返回 0;smembers列出这个Set集合中的所有数据;
127.0.0.1:6379> sadd myset set1
(integer) 1
127.0.0.1:6379> sadd myset set2
(integer) 1
127.0.0.1:6379> sadd myset set3 set4 set5
(integer) 3
127.0.0.1:6379> get myset
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> scard myset
(integer) 5
127.0.0.1:6379> SMEMBERS myset
1) "set1"
2) "set2"
3) "set3"
4) "set4"
5) "set5"
127.0.0.1:6379> sismember myset set1
(integer) 1
127.0.0.1:6379> sismember myset s
(integer) 0
127.0.0.1:6379> sismember myset
(error) ERR wrong number of arguments for 'sismember' command
127.0.0.1:6379>
SPOP/SREM/SRANDMEMBER
spop
弹出元素,格式为 spop key count,随机弹出指定数量的元素,具有随机性,并对其进行显示;
srem
删除元素,格式为srem key member,删除指定的元素
127.0.0.1:6379> spop myset 2
1) "set2"
2) "set4"
127.0.0.1:6379> SMEMBERS myset
1) "set1"
2) "set3"
3) "set5"
127.0.0.1:6379> srem myset set3
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "set1"
2) "set5"
127.0.0.1:6379>
**SRANDMEMBER **key [count]
等同于spop,区别是 不会删除元素
**SMOVE **source destination member, 将元素从一个集合转到另一个集合
sinter/sunion/sdiff
sinter
交集获取相同的数据,结合SQL中的 inner join 理解
sunion
并集获取大家都有的数据,结合SQL的union 理解
sdiff
比较两个集合的内容,把不同的地方体现出来
127.0.0.1:6379> sadd mysetr set1 set2 set3 set4
(integer) 4
127.0.0.1:6379> smembers myset
1) "set1"
2) "set5"
127.0.0.1:6379> smembers mysetr
1) "set1"
2) "set2"
3) "set3"
4) "set4"
127.0.0.1:6379> sdiff myset mysetr
1) "set5"
127.0.0.1:6379> sinter myset mysetr
1) "set1"
127.0.0.1:6379> sunion myset mysetr
1) "set1"
2) "set5"
3) "set2"
4) "set3"
5) "set4"
127.0.0.1:6379> sadd myset set6
(integer) 1
127.0.0.1:6379> sdiff myset mysetr
1) "set5"
2) "set6"
127.0.0.1:6379>
sunionstore/sinterstore/sdiffstore
将取出来的交集和并集放到一个集合中
127.0.0.1:6379> sunionstore mysetunion myset mysetr
(integer) 6
127.0.0.1:6379> smembers mysetunion
1) "set1"
2) "set5"
3) "set6"
4) "set2"
5) "set3"
6) "set4"
127.0.0.1:6379>
总结
- 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
- 利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的
intersections命令就可以充分发挥它的方便和效率的优势了。
Hash哈希类型
我们可以将Redis中的Hash类型看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。
HSET/HGET/HEXISTS/HLEN/HDEL
HSET key field val添加元素HGET key field获取元素
127.0.0.1:6379> hset myhset id 1 name a
(integer) 0
127.0.0.1:6379> hget myhset id
"1"
127.0.0.1:6379> hget myhset name
"a"
127.0.0.1:6379>
HEXISTS key field判断值是否存在HLEN key获取字段长度
127.0.0.1:6379> hexists myhset id
(integer) 1
127.0.0.1:6379> hlen myhset
(integer) 2
127.0.0.1:6379>
HDEL key field [field ...]删除元素
127.0.0.1:6379> hdel myhset id
(integer) 1
127.0.0.1:6379> hlen myhset
(integer) 1
127.0.0.1:6379>
HSETNX/HGETALL/HKEYS/HVALS/HMGET
HSETNX key field value等同于SETNXHGETALL key获取指定key中所有的值HKEYS key只获取字段名HVALS key只获取字段值HMGET KEY/HMSET KEY
127.0.0.1:6379> hsetnx myhset id 1
(integer) 1
127.0.0.1:6379> hgetall myhset
1) "name"
2) "a"
3) "id"
4) "1"
127.0.0.1:6379> hkeys myhset
1) "name"
2) "id"
127.0.0.1:6379> hvals myhset
1) "a"
2) "1"
127.0.0.1:6379> hmget myhset id name
1) "1"
2) "a"
127.0.0.1:6379> hmset myhset id 2 name b
OK
127.0.0.1:6379> hkeys myhset
1) "name"
2) "id"
127.0.0.1:6379> hgetall myhset
1) "name"
2) "b"
3) "id"
4) "2"
127.0.0.1:6379>
Zset有序集合类型
它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是ZSET中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序.
Zset中添加、删除或更新一个成员都是非常快速的操作;
zset的中的功能,使用SET都可以做到
ZAdd/Zcard/ZCOUNT/ZREM···
zadd添加zset有序集合的内容
ZADD key score member [score] [member] ,
127.0.0.1:6379> zadd zsetkey 101 setkeymember1 102 setkeymemeber2 103 setkeymember3
(integer) 3
127.0.0.1:6379>
zcard查看zset的大小尺寸zcount查看指定范围内的数量zrem移除zset的member内容zrange查看范围内容ZSCORE key member获得分数zrank获得排名
127.0.0.1:6379> zcard zsetkey
(integer) 3
127.0.0.1:6379> zcount zsetkey 101 102
(integer) 2
127.0.0.1:6379> zadd zsetkey 1000 setkeymember1000
(integer) 1
127.0.0.1:6379> zcard zsetkey
(integer) 4
127.0.0.1:6379> zadd zsetkey 2001 set2000
(integer) 1
127.0.0.1:6379> zcount zsetkey 50 500
(integer) 3
127.0.0.1:6379> zrem zsetkey setkeymember1000
(integer) 1
127.0.0.1:6379> zrange zsetkey 0 -1
1) "setkeymember1"
2) "setkeymemeber2"
3) "setkeymember3"
4) "set2000"
127.0.0.1:6379> zscore zsetkey set2000
"2001"
127.0.0.1:6379> zrank zsetkey set2000
(integer) 3
127.0.0.1:6379>
博客学习内容
redis学习(六)——Sorted Set数据类型 - 平凡希 - 博客园
1. ZADD/ZCARD/ZCOUNT/ZREM/ZINCRBY/ZSCORE/ZRANGE/ZRANK:#在Shell的命令行下启动Redis客户端工具。/> redis-cli#添加一个分数为1的成员。redis 127.0.0.1:6379> zadd myzset 1 "one"(integer) 1#添加两个分数分别是2和3的两个成员。redis 127.0.0.1:6379> zadd myzset 2 "two" 3 "three"(integer) 2#0表示第一个成员,-1表示最后一个成员。WITHSCORES选项表示返回的结果中包含每个成员及其分数,否则只返回成员。redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES1) "one"2) "1"3) "two"4) "2"5) "three"6) "3"#获取成员one在Sorted-Set中的位置索引值。0表示第一个位置。redis 127.0.0.1:6379> zrank myzset one(integer) 0#成员four并不存在,因此返回nil。redis 127.0.0.1:6379> zrank myzset four(nil)#获取myzset键中成员的数量。 redis 127.0.0.1:6379> zcard myzset(integer) 3#返回与myzset关联的Sorted-Set中,分数满足表达式1 <= score <= 2的成员的数量。redis 127.0.0.1:6379> zcount myzset 1 2(integer) 2#删除成员one和two,返回实际删除成员的数量。redis 127.0.0.1:6379> zrem myzset one two(integer) 2#查看是否删除成功。redis 127.0.0.1:6379> zcard myzset(integer) 1#获取成员three的分数。返回值是字符串形式。redis 127.0.0.1:6379> zscore myzset three"3"#由于成员two已经被删除,所以该命令返回nil。redis 127.0.0.1:6379> zscore myzset two(nil)#将成员one的分数增加2,并返回该成员更新后的分数。redis 127.0.0.1:6379> zincrby myzset 2 one"2"#将成员one的分数增加-1,并返回该成员更新后的分数。redis 127.0.0.1:6379> zincrby myzset -1 one"1"#查看在更新了成员的分数后是否正确。redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES1) "one"2) "1"3) "three"4) "3"2. ZRANGEBYSCORE/ZREMRANGEBYRANK/ZREMRANGEBYSCOREredis 127.0.0.1:6379> del myzset(integer) 1redis 127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four(integer) 4#获取分数满足表达式1 <= score <= 2的成员。redis 127.0.0.1:6379> zrangebyscore myzset 1 21) "one"2) "two"#获取分数满足表达式1 < score <= 2的成员。redis 127.0.0.1:6379> zrangebyscore myzset (1 21) "two"#-inf表示第一个成员,+inf表示最后一个成员,limit后面的参数用于限制返回成员的自己,#2表示从位置索引(0-based)等于2的成员开始,取后面3个成员。redis 127.0.0.1:6379> zrangebyscore myzset -inf +inf limit 2 31) "three"2) "four"#删除分数满足表达式1 <= score <= 2的成员,并返回实际删除的数量。redis 127.0.0.1:6379> zremrangebyscore myzset 1 2(integer) 2#看出一下上面的删除是否成功。redis 127.0.0.1:6379> zrange myzset 0 -11) "three"2) "four"#删除位置索引满足表达式0 <= rank <= 1的成员。redis 127.0.0.1:6379> zremrangebyrank myzset 0 1(integer) 2#查看上一条命令是否删除成功。redis 127.0.0.1:6379> zcard myzset(integer) 03. ZREVRANGE/ZREVRANGEBYSCORE/ZREVRANK:#为后面的示例准备测试数据。redis 127.0.0.1:6379> del myzset(integer) 0redis 127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four(integer) 4#以位置索引从高到低的方式获取并返回此区间内的成员。redis 127.0.0.1:6379> zrevrange myzset 0 -1 WITHSCORES1) "four"2) "4"3) "three"4) "3"5) "two"6) "2"7) "one"8) "1"#由于是从高到低的排序,所以位置等于0的是four,1是three,并以此类推。redis 127.0.0.1:6379> zrevrange myzset 1 31) "three"2) "two"3) "one"#由于是从高到低的排序,所以one的位置是3。redis 127.0.0.1:6379> zrevrank myzset one(integer) 3#由于是从高到低的排序,所以four的位置是0。redis 127.0.0.1:6379> zrevrank myzset four(integer) 0#获取分数满足表达式3 >= score >= 0的成员,并以相反的顺序输出,即从高到底的顺序。redis 127.0.0.1:6379> zrevrangebyscore myzset 3 01) "three"2) "two"3) "one"#该命令支持limit选项,其含义等同于zrangebyscore中的该选项,只是在计算位置时按照相反的顺序计算和获取。redis 127.0.0.1:6379> zrevrangebyscore myzset 4 0 limit 1 21) "three"2) "two"
学好基础,打好数据结构的基础,比什么都强!
