-
数据结构---字符串《String》
-
数据结构----哈希《hash》
-
数据结构----列表《List》
-
数据集合----集合《SET》
-
数据结构----《有序集合》
-
全局命令
1、数据结构---字符串《String》
1.1)字符串类型:实际上可以是字符串(包括XML、JSON),还有数字(整型、浮点数),二进制(图片、音频、是视频),最大不能操作512MB
1. 2)设置命令:set age 23 ex 10 //十秒后过期
setnx age test //不存在键name时,返回1设置成功;存在的话失败返回0
set age xx //存在age时,返回成功
场景:如果有多客户端同时执行setnx,只有一个能设置成功,可做分布式锁
获值命令:get age //存在返回value值,不存在则韩辉nil
批量设值:mset country china city beijing
批量获取:mget country city address //返回china beijing,address为nil
若没有mget命令,则要执行n次get命令(如下图)
使用mget=1次网络请求+redis内部n次查询(如下图)
1.3)计数
incr age //必须为整数自加一,非整数返回错误,无age键从0自增返回1
decr age //整数 age 减一
incrby age 2 //整数age+2
decrby age 2 //整数age-2
incrbyfloat score 1.1 //浮点型 score+1.1
1.4)append 追加指令:set name hello;append name world //追加后成helloword
1.5)字符串长度:set hello “世界”; strlen hello //结果6,每个中文占3个字节
1.6)截取字符串:set name helloworld ; getrange name 2 4 //返回llo
2、数据结构----哈希《hash》
是一个sting类型的field和value的映射表,hash特适合用于存储对象。
以上图的指令分别是:
set user:1:name wangchl
set user:1:age 18
不难发现,用于字符串类型可以存储,但会过多占用key,浪费内存;
可以使用hash类型存储;
hmset user:1 name wangchl age 18
2.1)命令 hset key field value
设置:hset user:1 name wangchl //成功返回1,失败返回0
取值:hget user:1 name //返回wangchl
删值:hdel user:1 age //返回删除个数
计算个数:hset user:1 name wangchl ;hset user age 18;
hlen user:1 //返回2 ,user:1有两个属性值
批量设值hmset user:2 name wangchl james age 18 sex boy //返回OK
批量取值:hmget user:2 name age sex //返回三行: wangchl 18 boy
判断field:hkeys user:2 //返回name gae sex 三个fieId
获取user:2 所有value:hgetall user:2 //name age sex wangchl 18 boy 值
增加 1:hincrby user:2 age 1 //age+1
hincrbyfloat user:2 age //浮点型加2
2.2)应用场景
比如吧关系型数据表转为redis存储:
使用 hash 后的存储方式为:
如果有值为NULL,那么如下:
HASH 类型是稀疏:每个件可以有不同的filed,若用redis模拟做关系复杂查询开发困难,维护成本高
2.3)三种方案实现用户信息存储优缺点:
1)原生:set user:1:name wangchl
set user:1:age 23
set user:1:sex boy
优点:简单直观,每个键对应一个值
缺点:键数过多,占用内存多,用户信息过于分散,不用与生产环境
2)将对象序列化存入redis
set user:1 serialize(userInfo);
优点,变成简单,若使用序列化合理内存使用率高
缺点:序列化与反序列化有一定开销,更新属性时需要把userInfo全取出来进行反序列化,更新再序列化到redis
3)使用 hash类型
hmset user:1 name wangchl age 18 sex boy
优点:简单直观,使用合理可介绍内存消耗
缺点:要控制 ziplist 与 hashtable两种编码格式转换,且 hashtable 会消耗更多内存
总结:对于更新不多的情况下,可以使用序列化,对于value值不大于64字节的可以使用 hash 类型
3、数据结构---《列表(List)》
3.1、用来存储多个有序的字符串,一个列表最多可存 2 的 32 次方减 1 个元素
因为有序,可以用过索引下标获取元素或某个范围内元素列表,列表元素可以重复
3.2、列表命令:
添加命令:rpush wangchl c b a //从右向左插入 cba,返回值3
lrange wangchl 0 -1 //从左到右获取列表所有元素,返回 c b a
lpush key c b a //从左到右插入cba
linsert wangchl before b tracher //在b之前插入 teacher,after为之后,使用 lrange wangchl 0 -1 查 看 :c tracher b a
查找命令:
lrange key srart end //索引下标特点:从左到右为 0 到N-1
lindex wangchl -1 //返回最右末尾 l,-2 返回 h
llen wangchl //返回当前列表长度
lpop wangchl //把最左边的第一个元素删除
rpop wangchl //把最雨偶变的元素删除
lrem key count value //删除指定元素
如:lpush test b b b b j x z //键test放入 z x j b b b b
lrange test 0-1 //查询结果为 z x j b b b b
lrem test 4 b //从最右开始删除 b 的元素,删除 4 个,若lrem test 8 b, 删除8个b, 但只有5 个全部删除
lrange test 0 -1 //删除后的结果为 b j x z
lrem test 0 b //检索所有b全部删除 j x z
lpush user b b b b b j x z //键user从左到右放入 z x j b b b b b
ltrim user 1 3 //只保留从第2到第4的元素,其它全删
lrange user 0 -1 //查询结果为 x j b, 其它已全被删掉
lpush user01 z y x //键user01从左到右放入x y z
lset user01 2 java // 把第3个元素z替换成java
lrange user01 0 -1 //查询结果为 x y java
4、数据集合 ----《集合(SET)》
用户标签,社交,查询有共同兴趣爱好的人,智能推荐
保存多元素,与列表不一样的是不允许有重复元素,且集合是无序,一个几个最多可存 2 的 32次方减 1 个元素,出了支持增删改查,还支持几个交集、并集、差集;
4.1、集合命令
exists user //检查user 键值是否存在
sadd user a b c //向user插入3个元素,返回3
sadd user a b //若再加入相同的元素,则重复无效,返回0
smember user //获取 user 的所以元素,返回结果无序
srem user a //返回1,删除 a 元素
scard user //返回2,计算元素个数
sismember user a //判断元素是否在集合存在,存在返回1,不存在0
srandmember user 2 //随机返回 2 个元素,2位元素个数
spop user 2 //随机返回2个元素a b ,并将 a b 从集合中删除
smember user //此时已没有a b ,只有c
集合的交集:
sadd user:1 zhangsan 24 girl
sadd user:2 wangchl 24 boy //初始化两个集合
sinter user:1 user:2 //求两集合交集,此时返回24
sadd user:1 wang 24 girl //新增第三个元素
sinter user:1 user:2 user:3 //求三个集合的交集,此时返回24
4.2、使用场景:
标签、社交、查询有共同兴趣爱好的人,只能推荐
使用方式:
给用户添加标签:
sadd user:1:fav basball fball pq
sadd user:1:fav basball fball
...........................................
或给标签添加用户
sadd basball:users user:1 user:3
sadd fball:users user:1 user:2 user:3
........................................................
计算出共同感兴趣的人:
sinter user:1:fav user:2:fav
规则:sadd(常用于标签)spop/srandember(随机,比如抽奖)
sadd + sinter(用于社交、查询共同爱好的人,匹配)
5、数据结构----《有序集合》
常用于排行榜,入视频网站需要对用户上传视频做排行榜或点赞数
与集合有联系,不能有重复成员
与 List SET 对比
5.1命令
zadd key score member [score member......]
zadd user:zan 200 wangchl//wangchl的点赞数1, 返回操作成功的条数1
zadd user:zan 200 wangchl120 mike 100 lee// 返回3
zadd test:1 nx 100 james //键test:1必须不存在,主用于添加
zadd test:1 xx incr 200 wangchl//键test:1必须存在,主用于修改,此时为300
zadd test:1 xx ch incr -299 james //返回操作结果1,300-299=1
zrange test:1 0 -1 withscores //查看点赞(分数)与成员名
zcard test:1 //计算成员个数, 返回1
查点赞数
zadd test:2 nx 100 james //新增一个集合
zscore test:2 james //查看james的点赞数(分数),返回100
排名:
zadd user:3 200 james 120 mike 100 lee//先插入数据
zrange user:3 0 -1 withscores //查看分数与成员
lee | mike | james |
100 | 120 | 200 |
zrank user:3 james //返回名次:第3名返回2,从0开始到2,共3名
zrevrank user:3 james //返回0, 反排序,点赞数越高,排名越前
删除成员:
zrem user:3 jame mike //返回成功删除2个成员,还剩lee
增加分数:
zincrby user:3 10 lee //成员lee的分数加10
zadd user:3 xx incr 10 lee //和上面效果一样
返回指定排名范围的分数与成员
zadd user:4 200 james 120 mike 100 lee//先插入数据
zrange user:4 0 -1 withscores //返回结果如下图
zrevrange user:4 0 -1 withscores //倒序,结果如下图
返回指定分数范围的成员
zrangebyscore user:4 110 300 withscores //返回120 lee ,200 James, 由低到高
zrevrangebyscore user:4 300 110 withscores //返回200james 120lee,由高到低
zrangebyscore user:4 (110 +inf withscores//110到无限大,120mike 200james
zrevrangebyscore user:4 (110 -inf withscores//无限小到110,返回100 lee
返回指定分数范围的成员个数:
zcount user:4 110 300 //返回2,由mike120和james200两条数据
删除指定排名内的升序元素:
zremrangebyrank user:4 0 1 //分数升序排列,删除第0个与第1个,只剩james
删除指定分数范围的成员
zadd user:5 200 james 120 mike 100 lee//先插入测试数据
zremrangebyscore user:5 100 300 //删除分数在100与300范围的成员
zremrangebyscore user:5 (100 +inf //删除分数大于100(不包括100),还剩lee
有序集合交集:
格式:zinterstore destination numkeys key ... [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
destination:交集产生新的元素存储键名称
numkeys: 要做交集计算的键个数
key :元素键值
weights:每个被选中的键对应值乘weight, 默认为1
初始化数据:
zadd user:7 1 james 2 mike 4 jack 5 kate //初始化user:7数据
zadd user:8 3 james 4 mike 4 lucy 2 lee 6 jim //初始化user:8数据
交集例子:
zinterstore user_jj 2 user:7 user:8 aggregate sum //2代表键合并个数,
//aggregate sum可加也不可加上,因为默认是sum
//结果user_jj:4james(1+3), 6mike(2+4)
zinterstore user_jjmax 2 user:7 user:8 aggregate max 或min
//取交集最大的分数,返回结果 3james 4mike, min取最小
5.2使用场景:
排行榜系统,如视频网站需要对用户上传的视频做排行榜
点赞数:zadd user:1:20180106 3 mike //mike获得3个赞
再获一赞:zincrby user:1:20180106 1 mike //在3的基础上加1
用户作弊,将用户从排行榜删掉:zrem user:1:20180106 mike
展示赞数最多的5个用户:
zadd user:4:20160101 9 jack 10 jj 11 dd 3 james 4 lee 6 mark 7 kate
zrevrangebylex user:4:20160101 + - limit 0 5
查看用户赞数与排名:
zscore user:1:20180106 mike zrank user:1:20180106 mike
6 、全局命令
1,查看所有键:keys * set school enjoy set hello world
2,键总数 dbsize //2个键,如果存在大量键,线上禁止使用此指令
3,检查键是否存在:exists key //存在返回1,不存在返回0
4,删除键:del key //del hello school, 返回删除键个数,删除不存在键返回0
5,键过期:expire key seconds //set name test expire name 10 //10秒过期
ttl 查看剩余的过期时间
6,键的数据结构类型:type key //type hello //返回string,键不存在返回none
6.1键的遍历
redis提供了两个命令来遍历所有的键
1,键全量遍历:
mset country china city bj name james //设置3个字符串键值对
keys * //返回所有的键, *匹配任意字符多个字符
keys *y //以结尾的键,
keys n*e //以n开头以e结尾,返回name
keys n?me // ?问号代表只匹配一个字符 返回name,全局匹配
keys n?m* //返回name
keys [j,l]* //返回以j l开头的所有键 keys [j]ames 全量匹配james
考虑到是单线程, 在生产环境不建议使用,如果键多可能会阻塞
如果键少,可以
6.2、渐进式遍历
mset a a b b c c d d e e f f g g h h i i j j k k l l m m n n o o p p q q r r s s t t u u v v w w x x y y z z //初始化26个字母键值对
字符串类型:
SCAN命令用于迭代当前数据库中的数据库键。
返回结果为:用于下一次迭代的新游标4096;所有被迭代的元素
如果数据集合不是以哈希表作为底层实现的话,则scan类命令无视count选项,直接返回数据集合中的所 有元素
mset n1 1 n2 2 n3 3 n4 4 n5 5 n6 6 n7 7 n8 8 n9 9 n10 10 n11 11 n12 12 n13 13
scan 0 match n* //匹配以n开头的键,最大是取10条,第一次scan 0开始