一 redis的基础命令
set/get非常常用的字符串类型数据的写/覆盖,和读以下的命令是不区分数据类型(key-value类型是总类型,在redis中对于value数据结构是严格的区分的,存在五种不同的value数据类型)
1.1 keys *
表示在客户端查看当前redis服务端内存中所有的数据key值。
127.0.0.1:6379> keys *
1) "location"
2) "gender"
3) "age"
4) "name"
127.0.0.1:6379>
将已有的数据返回,没有数据时,返回空。这里返回的都是内存中保存的数据key值
注:
- 该命令不支持分布式结构。不能通过一个keys * 从一个redis服务集群中查看其它redis数据;
- 生产环境(客户使用环境)使用keys *不合理,会造成读数据阻塞(一次读太多数据);
1.2 exists key值
表示要查看一下对应的key值数据是否在redis内存中存在。
127.0.0.1:6379> keys *
1) "location"
2) "gender"
3) "age"
4) "name"
127.0.0.1:6379> exists age
(integer) 1
127.0.0.1:6379> exists abc
(integer) 0
注:
- 不可以使用get这种读操作代替exists判断存在的操作,因为使用读判断存在,浪费了读数据的带宽。而且redis 最新版本一个value数据可以达到1GB大小。
1.3 expire/pexpire key time
在redis中,可以根据需求对写入的数据设置超时时间,一旦到达超时条件将会在内存中把数据删除,expire 对某个key的数据做秒单位的超时,pexpire对key值做毫秒单位的超时。没有使用相关超时的数据写入时,默认是永久数据。
127.0.0.1:6379> expire location 5
(integer) 1
127.0.0.1:6379> keys *
1) "gender"
2) "age"
3) "name"
1.4 ttl/pttl key
在执行设置了超时时间的key值上,查看这个key的剩余时间。
ttl操作一个key能够看到剩余时间单位是秒,pttl看得是毫秒。
127.0.0.1:6379> expire name 100
(integer) 1
127.0.0.1:6379> ttl name
(integer) 89
127.0.0.1:6379> pttl name
(integer) 83322
127.0.0.1:6379>
注:
- 永久数据返回值-1
- 删除/不存在的数据返回值-2
1.5 del key删除数据
del可以对指定的key-value进行删除操作。
127.0.0.1:6379> keys *
1) "gender"
2) "age"
127.0.0.1:6379> del gender
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379>
1.6 save 存储持久化
redis支持持久化,将内存数据,输出到持久化文件,内存数据保存在磁盘上。
redis重新启动时自动加载保存的持久化文件,将数据恢复回来。
save命令的调用,就是将内存数据输出到持久化文件中保存。
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> save
OK
127.0.0.1:6379>
注:持久化详解.
1.7flushall
冲刷所有,删除所有数据。将当前redis服务的内存数据和持久化文件中的数据全部清空。
注:高危操作,请在服务端操作;
二 数据类型
redis是以key-value结构存储数据的,但是根据不同的应用场景,可以使用完全不同的value结构存储数据。包括:String字符串,Hash,List链表,Set集合,ZSet有序集合;
2.1 set key value
redis中可以对字符串类型进行写操作调用set命令,也可以在已有数据时,对数据覆盖操作。在redis的大量命令都可以携带很多不同的参数选项。使用详细的选项和参数,可以从redis官网去查看。
127.0.0.1:6379> set name wangergou
OK
127.0.0.1:6379> get name
"wangergou"
127.0.0.1:6379>
常用参数:
- EX:将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。
- PX:将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value 。
- NX:只在键不存在时,才对键进行设置操作。 执行 SET key value NX 的效果等同于执行 SETNX key value 。
注:SETNX是解决高并发情况常用锁 - XX : 只在键已经存在时, 才对键进行设置操作。
2.2 get key
从redis中读取key值的value数据。在redis中value最大数据长度1GB。
127.0.0.1:6379> get age
"55"
127.0.0.1:6379>
2.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.4数据类型String应用场景
一般使用String类型的value数据实现缓存的功能。并且可以利用代码的序列化和反序列化的方法,将对象序列化为字符串(user–>{“userName”:“wanglaoshi”}).比如在商城系统中使用序列化将product对象变成json,以商品id作为唯一key值操作商品在redis的缓存数据。
三 hash类型
hash在redis中底层是双层map形式存在,key-value是map,value在hash结构中又是一个map。所以他可以对应对象的数据结构。
3.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>
3.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>
3.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>
3.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>
3.5 hincrby
对hash类型,属性值为纯数字字符串内容做计步器;
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>
3.6应用场景
hash也可以像String一样,执行某个项目中的缓存逻辑。不同环境使用不同结构,有不同的效果。
例如,缓存数据对象的结构比较复杂,属性不仅仅是Integer String 还有数组,list,还有set,优先使用String类型,如果对象属性简单可以使用hash(造成代码编写复杂),有时hash类型减少网络传输次数
四 List双向链表
list底层是双向链表,可以从头和尾部处理数据,实现队列的结构(就为了处理消息队列逻辑)。
4.1 lpush/rpush key value
l/r 表示左和右。lpush从链表头部,插入数据,rpush从链表的尾部,插入数据;
127.0.0.1:6379> lpush student zhangshoufu wangcuihua liuyoucai
(integer) 3
127.0.0.1:6379> lrange student 0 -1
1) "liuyoucai"
2) "wangcuihua"
3) "zhangshoufu"
127.0.0.1:6379>
4.2 lrange key start end
可以对一个list链表中的元素范围内的数据读取返回。
语法:lrange student 起始下标 结束下标(-1表示读取到结束)
127.0.0.1:6379> lpush student zhangshoufu wangcuihua liuyoucai
(integer) 3
127.0.0.1:6379> lrange student 0 -1
1) "liuyoucai"
2) "wangcuihua"
3) "zhangshoufu"
127.0.0.1:6379>
4.3 lset key 元素下标index 修改值
对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>
注:
该命令不建议使用! 双向链表操作最有效,速度最快是对头尾的操作。lset可能会从中间操作链表,效率非常低(是数据结构自身特点所决定的特点)
4.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实现排队机制,先到先得
4.5llen key查看一个list长度
127.0.0.1:9000> lpush nums 1 2 3 4 5 6 7
(integer) 7
127.0.0.1:9000> llen nums
(integer) 7
127.0.0.1:9000>
4.6应用场景
初始目的就是利用list的类型实现排队队列的处理逻辑,先来先得,先到先处理。
可以在元素中封装一些消息属性,先进入队列,优先被pop出去进行处理。
五 SET集合
可以将不同的,不重复的元素值,放到一个没有顺序概念的集合中,实现value数据在redis的管理
5.1常用场景
-
登录系统时,给用户帖的标签。例如:登录一些明日头条这种推荐文件,推荐网站的系统,注册后选择自己兴趣爱好:军事,数学,历史,天文,登陆后会跟你你选择的内容,随机推荐不同的文章。
-
直播网站:lol 王者荣耀 dota2其他,根据兴趣推送相关直播,还可以实现好友保存,计算共同好友
5.2sadd key member
新增元素到集合中。
127.0.0.1:6379> sadd favor math english geo
(integer) 3
5.3srandmember key [count]
随机在key对应set集合中选取count个元素。
127.0.0.1:6379> srandmember favor
"english"
127.0.0.1:6379> srandmember favor 2
1) "math"
2) "geo"
5.4srem 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>
5.5sismember 查看一个元素是否属于这个集合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>
六 ZSET有序集合
在set基础之上,实现了排序的方式,元素也是不可以重复,就是在元素的数据上绑定了一个
评分的数字(实际应用场景中,评分可以表示不同业务意义,例如点击次数,例如播放量,例如投票数量等)
6.1常用应用场景
- 网站各种排名,都可以使用ZSET有序集合
- 视频网站:热播剧,top10。(评分播放次数)
- 热搜:话题搜索次数。(评分搜索次数)
- 小说网站:订阅量排序,月票排序
6.2zadd key score member
可以将一个元素绑定一个分数后,写入到一个有序集合中
127.0.0.1:6379> zadd score 98 piaoqian
(integer) 1
127.0.0.1:6379> zadd score 97 haoxia
(integer) 1
127.0.0.1:6379> zadd score 80 caoyang
(integer) 1
127.0.0.1:6379> zadd score 15000 xiaoxuwei
(integer) 1
6.3排序查询rank/range
在有序集合中主要就是为了体现排序,所以使用命令最多的查询方式
就是排序相关内容
- zrank key member:看看member的排名
127.0.0.1:6379> zrank score piaoqian
(integer) 2
- zrange key start stop:查询排名从start开始到stop范围内所有元素
起始排名是0,可以对stop=-1查到末尾
127.0.0.1:6379> zrange score 0 -1
1) "caoyang"
2) "haoxia"
3) "piaoqian"
4) "xiaoxuwei"
127.0.0.1:6379>
- zrangebyscore key minscore maxscore:在上限评分和下限评分之间的所有元素和排序
127.0.0.1:6379> zrangebyscore score 50 200
1) "caoyang"
2) "haoxia"
3) "piaoqian"
6.4zrem key member
将元素从zset类型的数据中删除