2、redis的1V5及其常用命令

1 代表一个key,5代表redis的五大常用数据类型。

一个通用的redis key命名规范:

表名:主键:主键值[:字段名] #字段名可选

news:id:1230666[:readnum]

redis的单线程处理模型

redis服务端是使用单线程来处理命令的。一个redis命令会依次经过命令发送、命令排队、命令执行、返回结果四个过程,一个命令从客户端到达服务端后,会先进入命令队列等待redis一个一个执行,所以命令的执行顺序和入队时间先后有关,和发送命令时间先后无关。因为不会有多个命令同时执行,所以不会产生并发问题,这就是Redis基本的单线程处理模型。

缺点:

因为是单线程处理,所以当有某个命令执行时间过长,其他命令也将等待,这将产生redis的噩梦——redis阻塞。

1、key

1.1、常用命令

exists key 查看某个key是否存在

del key[key..] 删除一个或多个key,不存在的可以被忽略

expire key 60 设置key60秒后过期,过期后自动删除。

pexpire key 60 设置key60毫秒后过期,过期后自动删除。

persist key 移除key的过期时间,变成永久有效的。

move key db 将当前库中的某个key移动到指定的库中

ttl key ttl(time to live)查看key的剩余过期时间,单位秒。-1表示永不过期 ,-2表示已过期

pttl key 查看key的剩余过期时间,单位毫秒。

type key 返回key对应的value的类型

randomkey 从当前数据库随机查询一个key

遍历键:

keys pattern 查看给定pattern匹配到的key。——>全量式遍历。

三个特殊符号:* 表示任意数量的任意字符 ? 表示任意一个字符。[] 表示括号内的任意一个字符。

如:keys * 或keys user* #返回key以user开头的键。keys h?llo keys n[abc]

scan cursor [pattern] [count] ——>增量式遍历。

scan命令可以解决keys命令可能带来的阻塞问题,同时Redis还提供了hscan、sscan、zscan渐进式地遍历hash、set、zset。

2、value

2.1、String :字符串

2.1.1、基本介绍

redis最基本的数据类型,可以存储任意类型的数据,如:序列后的对象、图片或二进制数据等,理论上一个String最多可以存储512M数据。

2.1.2、常用命令

set k1 v1 设置k1的值为v1

get k1 获得k1的值

append k1 hello 在k1值的最后追加hello

strlen k1 返回k1的值的字符串长度

incr/decr k1 k1的值单步增/减1

incrby/decrby k1 5 k1的值多步增/减指定步长

getrange k1 0 5 获取k1从0到5闭区间范围内的值,0到-1表示所有。

setrange k1 2 hello k1从2的索引位置开始的值设置为hello,长度和hello一样。

setex k1 10 v1 set和expire的结合,设置k1的有效时长为10秒,值为v1

psetex k1 10 v1 set和pexpire的结合,设置k1的有效时长为10毫秒,值为v1

setnx k1 v1 set(if not exist) 如果不存在k1时才设置k1。可作为分布式锁的实现方案之一。

mset k1 v1 k2 v2 k3 v3 设置多个kv对

mget k1 k2 k3 获取多个k对应的v

2.1.3、典型应用场景

1、生成唯一的ID:

对数据表进行水平拆分(同一个表的数据太多拆分到其他数据库中)时,需要该表内的主键id不能重复。

关于水平拆分可以参看这篇:https://www.cnblogs.com/firstdream/p/6728106.html

使用命令:incr

2、通过数据是否有效来控制业务行为

如:限制客户每4个小时才能投一次票,可以以 业务:用户id 为key,设置过期时间4小时,若没过期就不能投票,过期了才能投票

使用命令:

expire key second

3、分布式锁

setnx命令。利用setnx命令的特性(不存在时才会设置成功,多个客户端执行该命令,只有一个可以执行成功),根据返回值:

若返回1,表示设置成功,相当于拿到了操作的权利,就可以进行后续操作,操作后删除这个锁。

若返回0,表示设置失败,只能重新发送请求了。

问题:一般情况下是等拿到权限的用户操作完后,再释放锁,但是若是该用户拿到权限以后没有进行购买操作,或是该用户宕机了,此时的锁还在该用户手中,该用户无法操作了,其他没拿到锁也会无法操作,这就形成了死锁。

改良:

给这个key加上过期时间(expire命令),到时间后自动放弃锁。

时间一般为:请求最大耗时*120% + 平均网络延迟*110%

4、限时按次的服务控制

如后台接口防刷的控制:如限制用户每分钟只能访问10次

伪代码如下:

String result = get uid:10002
if(result == null){
    setex uid:10002 60 1
    return;
}else {
    if(result >= 10){
        return fail;
    }
    incr uid:10002 1
}

2.2、Hash:哈希表

2.2.1、基本介绍

一个string类型的field-value键值对的映射表,适合存储对象结构的数据。 但不适合作为对象列表去查询存储,即若想selectList时,不适合用hash存储。

理论上hash表没有存储上限,这和redis的最大内存设置和所在主机的最大内存有关系。

2.2.2、常用命令

hset k1 name tom  k1中添加一个哈希表,哈希表中的field为name,value为tom

hget k1 name 获取哈希表k1中field为name的value

hmset 设置多个field-value对

hmget  获取多个field-value对

hgetall k1 获取哈希表k1中所有的field-value对,相当于获取整个对象了

hdel k1 name age 删除哈希表k1中field为name和age的field-value对

hkeys k1 返回哈希表k1中的所有field

hvals k1 返回哈希表k1中所有的value

hlen k1 返回哈希表k1中所有field的数量

hexists k1 name 查看哈希表k1中field为name的field-value对是否存在

hincrby k1 age 2 哈希表k1中age属性的值加2,也可以为负数,负数就是减。

hincrbyfloat k1 grade 1.2 每次增加的都是小数。

2.2.3、典型应用场景

1、用户购物车

如:hset cart:1122334 goods:101 5 goods:202 1 #用户1122334的购物车中有个商品id101的商品,数量为5,商品id为202的商品,数量为1,此时商品的详细信息根据商品id到商品池中去找即刻。

有个商品池,每个商品用hash存储

hset goods:101 name '刮胡刀' price 150.00 ...

hset goods:202 name '蒙牛纯牛奶' price 45.00 ...

 

PS:关于对象是用String存储好还是Hash存储好?

1、string适用于对象整体的存储和读取,对象的属性不经常发生改变的情况。

2、hash适用于对象的属性可能经常发生改变的情况。

 

2.3、List :列表

2.3.1、 基本介绍

底层采用linkedlist(链表)存储数据。

特点:1)list中的元素都是有顺序且可重复的,每个元素都有一个索引下标。

   2)元素顺序与插入的顺序一致,适用于具有先后顺序的一组数据。

   3)可充当栈或队列的角色,又类似双向链表,可以同时从头部和尾部插入数据。

2.3.2、常用命令

操作

命令

例子

增加

lpush

rpush

lpush k1 a b c 从左边添加k1的值a、b、c

rpush k1 e f d 从右边添加k1的值e、f、d

linsert

linsert k1 before java mysql 向第一个java元素之前插入mysql元素

删除

lpop

rpop

lpop k1 从左边取出

rpop k1 从右边取出

lrem

lrem k1 3 aa 从左往右找到k1中3个等于aa的值,并删除掉。当为0时,删除所有等于aa的值

修改

lset

lset k1 2 aa 设置k1的值中下标为2的值为aa

ltrim

itrim k1 0 3 列表截取,只保留下标从0到3闭区间内的元素。

查询

lrange

lrange k1 start end 返回k1的value指定左右都闭区间的值,0到-1表示全部的

lindex

lindex k1 2 返回k1中索引下标为2的元素

llen

llen k1 返回k1对应的列表值的长度

阻塞操作

blpop

brpop

blpop和brpop是lpop和rpop的阻塞版本,语法为blpop key[key...] timeout

会阻塞一个或多个列表 timeout秒。timeout为0表示会一直阻塞。多个列表时按顺序查找,返回第一个非空列表的头元素。

1)若某列表不为空,则立即返回数据。

2)若列表为空,则会阻塞timeout秒,在此期间若任何一个列表被添加了值,则立即返回

注意:如果多个客户端对同一个键执行brpop,那么最先执行brpop命

令的客户端可以获取到弹出的值。比如,抢火车票。

 

2.3.3、典型应用场景

1、朋友圈点赞功能

动态id为key,对应的点赞用户为value。

点赞:rpush

取消点赞:lrem

2、关注列表、粉丝列表。

3、集群环境下合并系统操作日志... (利用列表的有序性,一个一个的pop,简单的消息队列功能)

 

2.4、Set:集合

2.4.1、基本介绍

类似java中的set(无序不可重复,后续的重复数据会添加失败),查询效率高于列表,底层是HashTable。

2.4.2、常用命令

操作

命令

实例

添加

sadd

sadd key 1 2 3 4 5 添加一个或多个元素

查询

smembers

smembers key 返回集合中的所有元素,顺序与添加时一致。

sismember

sismember key value 判断value是否是集合key中的成员,是返回1,否返回0

scard

scard key 返回集合key的长度

删除

srem

srem key 3 4 5 删除集合key中指定的一个或多个元素

smove

smove key1 key2 5 将key1中的元素5 移动到key2里面去

随机访问

srandmember key

srandmember key 从key中随机返回一个元素

srandmember key [count]

srandmember key 3 随机返回3个元素。如果count为负数,则返回的元素可能会重复

随机弹出

spop

spop key 从集合中随机弹出一个元素,该元素将从集合中消失

求交集、并集、差集

sinter

sinter key1 key2 求交集,返回两个集合中相同的部分

sunion

sunion key1 key2 求并集,返回两个集合合并后的结果,会去重

sdiff

sdiff set1 set2 求差集,返回set1相较于set2不同的部分,只返回set1区别于set2的元素

2.4.3、典型应用场景

1、共同关注、共同好友

sinter 求交集

2、统计网站访问量(pv、uv、ip)

pv(page view),即页面访问量,刷新一次也算是一次pv。                 

uv(unique visitor),即独立访客数,根据ip来做统计指标。 

利用set集合去重的特性

3、实现网站访问控制的黑白名单

黑名单:屏蔽哪些用户,不让他们访问。

白名单:限定哪些用户,只让他们访问。

利用set集合不重复的特性,每次都到set集合中去比对是否能访问。

 

2.5、Sorted Set:有序集合

2.5.1、基本介绍

特点:集合中每个元素都会关联一个double类型的分数(整数或者双精度小数),默认根据元素的score对集合中的元素进行从小到大的排序。元素不能重复的,但分数(score)可以重复。相同元素可以重复添加,但只保留最后一个。

2.5.2、常用命令

1)添加操作

zadd zkey 10 bob [20 lucy 30 tom ..] 添加一个或多个元素

2)查询操作

zrange key start end [withscores]       返回指定区间内的元素,默认从小到大排序。

zrevrange key start end [withscores]  根据分数按从大到小的顺序返回所有元素。

zcard zcard zkey 返回集合中元素的个数

zcount zcount zkey 60 100 返回分数在[60,100]中的元素的个数

zrank zrank zkey tom 返回tom(根据分数从小到大)在集合中的排名,第一个排名为0

zrevrank zrevrank zkey tom 降序排列时tom的排名

按条件查询

zrangebyscore zkey 10 30 withscores limit 0 10 根据分数条件查询,查询分数在[10,30]范围内的元素带着分数。从0 开始查询10个元素

zrevrangebyscore zkey 30 10 根据分数闭区间倒叙查询,分数条件也必须是从大到小。

zrevrangebyscore zkey +inf -inf withscores limit 0 2 在不知道最大分数和最小分数时,+inf表示最大的分数 -inf表示最小的分数

删除

zrem zrem zkey bob 删除集合中一个或多个元素

按条件删除

zremrangebyrank zkey 0 2 根据排名删除。按分数升序排名时,删除排名中第一个到第三个的元素。-1为最后一个,-2为倒数第二个...

zremrangebyscore zkey 10 50 根据分数删除。删除分数在[10,50]范围内的元素。

score的查询和修改

zscore zkey aa 查询zkey集合中aa的分数

zincrby zkey 1 aa 给zkey1集合中aa的分数+1 正数则加,负数则减。

2.5.3、典型应用场景

1、各种排行榜

zrevrange按照从大到小的顺序查询返回。zincrby对元素的分数增加或减少以改变排名。

集合中以id为元素最好,这样便于查找。

 

3、redis服务管理指令

内容待补充。。。

4、redis数据库管理指令

  • select 数字 来切换库。
  • dbsize 来查询当前库中key的数量。
  • 通过flushdb 来清空当前库,通过flushall 来清空所有库。

 

以上为redis的1V5及其常用命令的内容。关于每个命令的具体应用,以后我会在《redis的应用实例》博客中做一些常用的实例,敬请期待!

 

上一篇:1、redis的简介与Linux、windows下的安装

下一篇:3、redis的内置实用小功能

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值