1.Redis的常用命令
在redis中key-value类型是总类型,在redis中对于value数结构是严格区分的,存在五种不同的value数据类型。
1.1keys *
表示在客户端查看当前redis服务端内存中所有的数据key值。将已有的数据返回,没有数据时,返回空。这里返回的都是内存中保存的数据key值。
通过命令redis-cli -p 9000 登录一个客户端,通过keys * 查看:
注意:
1.不支持分布式结构。不能通过一个keys *从一个redis服务中查看其它redis数据
2.生产环境(客户使用环境)使用keys *不合理,造成读数据阻塞(一次读太多数据)
1.2 exists key
表示要查看一下对应的key值数据是否在redis内存中存在
存在的情况
不存在的情况
不可以使用get这种读操作代替exists判断存在的操作,因为使用读判断存在,浪费了读数据的带宽。而且redis 最新版本一个value数据可以,达到1GB大小
1.3 expire/pexpire key time
在redis中,可以根据需求对写入的数据设置超时时间,一旦到达超时条件将会在内存中把数据删除,expire 对某个key的数据做秒单位的超时,pexpire对key值做毫秒单位的超时。没有使用相关超时的数据写入时,默认是永久数据
例如:设置name 70秒的超时时间
超时后再次查看,对应的数据已经被删除
1.4 ttl/pttl key
在执行设置了超时时间的key值上,查看这个key的剩余时间。ttl操作一个key能够看到剩余时间单位是秒,pttl看得是毫秒
例:查询上面name剩余的时间
1.5del key删除数据
del可以对指定的key-value进行删除操作
例如:删除 num
1.6 save 存储持久化
redis支持持久化,将内存数据,输出到持久化文件,内存数据保存在磁盘上。
redis重新启动时自动加载保存的持久化文件,将数据恢复回来。
save命令的调用,就是将内存数据输出到持久化文件中保存。
可以使用kill -9 模拟redis的突然断电效果
1.7flushall
冲刷所有,删除所有数据。将当前redis服务的内存数据和持久化文件中的数据全部清空。
尽可能只在测试环境使用,不要到生产环境
2.五种数据结构
redis是以key-value结构存储数据的,但是根据不同的应用场景,可以使用完全不同的value结构存储数据。包括:String字符串,Hash,List链表,Set集合,ZSet有序集合
2.1String类型数据
2.1.1 set key value
redis中可以对字符串类型进行写操作调用set命令,也可以在已有数据时,对数据覆盖操作。在redis的大量命令都可以携带很多不同的参数选项。使用详细的选项和参数,可以从redis官网去查看 https://redis.io/
EX:可以在set时直接设置超时秒数
PX:可以在set时直接设置超时毫秒数
- 127.0.0.1:6379> set bomb tnt EX 50
- OK
- 127.0.0.1:6379> ttl bomb
- (integer) 46
- 127.0.0.1:6379>
NX:在执行set时,会判断redis中有没有该key值,如果有则无法set,没有则可以set成功。表示,只有第一个set数据的客户端可以成功,后续都会失败。
- 127.0.0.1:6379> keys *
- 1) "age"
- 127.0.0.1:6379> set age 22 NX
- (nil)
- 127.0.0.1:6379> set name wanglaoshi NX
- OK
- 127.0.0.1:6379>
XX:在执行set时,会判断redis中有没有key值,有的时候才会set成功,没有则不成功。表示,使用XX的客户端没有新建的权限。
- 127.0.0.1:6379> keys *
- 1) "age"
- 127.0.0.1:6379> set gender male XX
- (nil)
- 127.0.0.1:6379> set age 55 XX
- OK
2.1.2 get key
从redis中读取key值的value数据。在redis中value最大数据长度1GB。
- 127.0.0.1:6379> get age
- "55"
- 127.0.0.1:6379>
如果想要删除字符串类型数据就是调用del命令
2.1.3 incr/incrby decr/decrby
执行计步器,可以增加数值,减少数值。对应value字符串数据必须是纯数字
- 127.0.0.1:6379> incr age
- (integer) 56
- 127.0.0.1:6379> decr age
- (integer) 55
- 127.0.0.1:6379> incrby age 10
- (integer) 65
- 127.0.0.1:6379> decrby age 20
- (integer) 45
常见的应用使用计步器:
记录排队人数(拿号,自增,叫号后,前剩余人数自减);
在线人数统计(每秒钟上下变动)
2.1.4数据类型String应用场景
一般使用String类型的value数据实现 缓存的功能。并且可以利用代码的序列化和反序列化的方法,将对象序列化为字符串(user-->{“userName”:“wanglaoshi”}).在easymall中使用序列化将product对象变成json,以商品id作为唯一key值操作商品在redis的缓存数据。
2.2 hash类型
hash在redis中底层双层map形式存在,key-value是map,value在hash结构中又是一个map。所以他可以对应对象的数据结构。
2.2.1 hset key field value
在redis中创建一个key值为key 对应第二层map的key为field,
第二层map的value为value
- 127.0.0.1:6379> hset user age 18
- (integer) 1
- 127.0.0.1:6379> hset user name wanglaoshi
- (integer) 1
- 127.0.0.1:6379> hset user gender male
- (integer) 1
- 127.0.0.1:6379> keys *
- 1) "age"
- 2) "user"
- 127.0.0.1:6379>
2.2.2 hget key field
由于hash结构双层map,hget可以读取到一个属性的值,指定某个key的 某个属性读取
- 127.0.0.1:6379> hget user name
- "wanglaoshi"
- 127.0.0.1:6379> hget user age
- "18"
- 127.0.0.1:6379>
2.2.3 hkeys/hvals key
hkeys key从key值的hash数据结构中将所有的field属性名称返回
hvals key 从key的hash数据结构中将所有的field的值返回
- 127.0.0.1:6379> hkeys user
- 1) "age"
- 2) "name"
- 3) "gender"
- 127.0.0.1:6379> hvals user
- 1) "18"
- 2) "wanglaoshi"
- 3) "male"
- 127.0.0.1:6379>
2.2.4 删除数据
如果想将整个hash结构删掉,直接调用del 全部删除
如果删除的是一个hash结构中的某个属性和值---hdel key field
- 127.0.0.1:6379> hkeys user
- 1) "age"
- 2) "name"
- 3) "gender"
- 127.0.0.1:6379> hdel user age
- (integer) 1
- 127.0.0.1:6379> hkeys user
- 1) "name"
- 2) "gender"
- 127.0.0.1:6379>
2.2.5 hincrby
为哈希表中的字段值加上指定增量值。
增量也可以为负数,相当于对指定字段进行减法操作。
如果哈希表的 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。
对一个储存字符串值的字段执行 HINCRBY 命令将造成一个错误。
- 127.0.0.1:9000> hset user age 18
- (integer) 1
- 127.0.0.1:9000> hincrby user age 1
- (integer) 19
- 127.0.0.1:9000>
2.2.5应用场景
也可以像String一样,执行某个项目中的缓存逻辑。不同环境使用不同结构,有不同的效果。
例如,缓存数据对象的结构比较复杂,属性不仅仅是Integer String 还有数组,list,还有set,优先使用String类型,如果对象属性简单可以使用hash(造成代码编写复杂)
2.3 List双向链表
list底层双向链表,可以从头和尾部处理数据,实现队列的结构(就为了处理消息队列逻辑)。
2.3.1 lpush/rpush key value
l/r 表示左和右。lpush从链表头部,插入数据,rpush从链表的尾部,插入数据
- 127.0.0.1:6379> lpush student wangcuihua
- (integer) 1
- 127.0.0.1:6379> lpush student liuyoucai
- (integer) 2
- 127.0.0.1:6379> rpush student zhangshoufu
- (integer) 3
- 127.0.0.1:6379>
行程链表结构顺序:
liuyoucai
wangcuihua
zhangshoufu
2.3.2 lrange key start end
可以对一个list链表中的元素范围内的数据读取返回。
lrange student 起始下标 结束下标
- 127.0.0.1:6379> lrange student 0 4
- 1) "liuyoucai"
- 2) "wangcuihua"
- 3) "zhangshoufu"
- 127.0.0.1:6379> lrange student 1 4
- 1) "wangcuihua"
- 2) "zhangshoufu"
- 127.0.0.1:6379>
有时候,咱们并不会确定不知道元素的个数,要想查看所有的元素可以使用-1的end结尾
表示一直到尾部。start=0 end=-1 就可以查询一个list所有内容
- 127.0.0.1:6379> lrange student 0 -1
- 1) "liuyoucai"
- 2) "wangcuihua"
- 3) "zhangshoufu"
- 127.0.0.1:6379>
2.3.3 lset key 元素下标index 修改值
不建议使用,双向链表操作最有效,速度最快是对头尾的操作。
lset可能从中间操作链表,效率非常低
对list的某个下标为index的元素值,做修改
- 127.0.0.1:6379> lrange student 0 -1
- 1) "liuyoucai"
- 2) "wangcuihua"
- 3) "zhangshoufu"
- 127.0.0.1:6379> lset student 1 haha
- OK
- 127.0.0.1:6379> lrange student 0 -1
- 1) "liuyoucai"
- 2) "haha"
- 3) "zhangshoufu"
- 127.0.0.1:6379>
2.3.4 rpop/lpop key
rpop从链表的尾部删除元素,并且将删除的元素值返回
lpop从链表的头部删除元素,将元素值返回(remove)
- 127.0.0.1:6379> lrange student 0 -1
- 1) "liuyoucai"
- 2) "haha"
- 3) "zhangshoufu"
- 127.0.0.1:6379> rpop student
- "zhangshoufu"
- 127.0.0.1:6379> lpop student
- "liuyoucai"
- 127.0.0.1:6379> lrange student 0 -1
- 1) "haha"
- 127.0.0.1:6379>
配合lpush和rpush实现排队机制,先到先得
2.3.5应用场景
初始目的就是利用list的类型实现排队队列的处理逻辑,先来先得,先到先处理。
可以在元素中封装一些消息属性,先进入队列,优先被pop出去进行处理。
2.4.SET集合
可以将不同的,不重复的元素值,放到一个没有顺序概念的集合中,实现value数据在redis的管理
2.4.1sadd key member
新增元素到集合中。
- 127.0.0.1:6379> sadd favor math english geo
- (integer) 3
2.4.2 srandmember key [count]
随机在key对应set集合中选取count个元素。
下面分别为随机选取一个、随机选取2个,如果选取的值等于实际值,则全部显示
- 127.0.0.1:6379> srandmember favor
- "english"
- 127.0.0.1:6379> srandmember favor 2
- 1) "math"
- 2) "geo"
2.4.3 srem key 元素值
可以对集合中某个元素进行去除的操作,当删除成功,返回1,删除失败返回0
- 127.0.0.1:6379> srem favor math
- (integer) 1
- 127.0.0.1:6379> srem favor mathdasfdads
- (integer) 0
- 127.0.0.1:6379>
2.4.4 sismember 查看一个元素是否属于这个集合
- 127.0.0.1:6379> sismember favor math
- (integer) 0
- 127.0.0.1:6379> sismember favor english
- (integer) 1
- 127.0.0.1:6379>
2.4.5常用场景
登录系统时,给用户帖的标签。
例如:登录一些今日头条这种推荐文件,推荐网站的系统,注册后选择自己兴趣爱好:军事,数学,历史,天文,登陆后会跟你你选择的内容,随机推荐不同的文章。
直播网站:lol 王者荣耀 dota2其他,根据兴趣推送相关直播
还可以实现好友保存,计算共同好友
2.5 ZSET有序集合
在set基础之上,实现了排序的方式,元素也是不可以重复,就是在元素的数据上绑定了一个
评分的数字(实际应用场景中,评分可以有不同业务意义,例如点击次数,例如播放量,例如投票数量等)
2.5.1 zadd key score member
可以将一个元素绑定一个分数后,写入到一个有序集合中
- 127.0.0.1:6379> zadd score 98 zhangsan
- (integer) 1
- 127.0.0.1:6379> zadd score 97 lisi
- (integer) 1
- 127.0.0.1:6379> zadd score 80 wangwu
- (integer) 1
- 127.0.0.1:6379> zadd score 15000 zhoaliu
- (integer) 1
2.5.2 排序查询rank/range
在有序集合中主要就是为了体现排序,所以使用命令最多的查询方式
就是排序相关内容
zrank key member:看看member的排名
- 127.0.0.1:6379> zrank score zhansan
- (integer) 2
zrange key start stop:查询排名从start开始到stop范围内所有元素
起始排名是0,可以对stop=-1查到末尾
- 127.0.0.1:6379> zrange score 0 -1
- 1) "zhangsan"
- 2) "lisi"
- 3) "wangwu"
- 4) "zhaoliu"
- 127.0.0.1:6379>
zrangebyscore key minscore maxscore:在上限评分和下限评分之间的所有元素和排序
- 127.0.0.1:6379> zrangebyscore score 50 200
- 1) "zhangsan"
- 2) "lisi"
- 3) "wangwu"
2.5.3 zrem key member
将元素从zset类型的数据中删除
2.5.4 常用应用场景
网站各种排名,都可以使用ZSET有序集合
视频网站:热播剧,top10。
热搜:话题搜索次数。
小说网站:订阅量排序,月票排序