目录
Redis命令不区分大小写的,而key是区分大小写的
- Redis查看版本
- 方式1:
- [root@localhost bin]# redis-server -v
- Redis server v=7.2.3 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=5d4f410fac2878e4
- [root@localhost bin]#
- 方式2:
- 127.0.0.1:6379> info
- # Server
- redis_version:7.2.3
- redis_git_sha1:00000000
- redis_git_dirty:0
- redis_build_id:5d4f410fac2878e4
- redis_mode:standalone
- os:Linux 3.10.0-1160.71.1.el7.x86_64 x86_64
- arch_bits:64
- monotonic_clock:POSIX clock_gettime
- multiplexing_api:epoll
- atomicvar_api:atomic-builtin
- .....
- 面试题:
- 1、redis五种传统的数据类型你如何使用的?用在哪些场景?
-
- 2、除了上述5大数据类型,你还知道其他redis的类型吗?
- bitmap(位图)
- HyperLogLog(统计)
- GEO(地理)
- Stream
- 1、最常用
- set key value
- get key
-
- 2、同时设置/获取多个键值
- mset key value key value ...
- mget key key1 ....
-
- 3、数值增减
- 递增数字
- incr key
- 增加指定整数
- incrby key increment
- 递减数值
- decr key
- 减少指定的整数
- decrby key decrement
-
- 4、获取字符串的长度
- strlen key
-
- 5、分布式锁
- setnx key value
- set key value [EX seconds] [PX milliseconds] [NX|XX]
- EX:key在多少秒之后过期
- PX:key在多少毫秒之后过期
- NX:当key不存在的时候,才创建key,效果等同于setnx
- XX:当key存在的时候,覆盖key
应用场景:
1、商品编号、订单号采用INCR命令生成
2、是否喜欢的文章(点赞/踩一踩) 统计喜欢/不喜欢某篇文章
阅读数,只要点击了rest地址,直接可以使用incr key命令增加一个数字1,完成记录数字
- 1、向列表左边添加元素
- LPUSH key value [value...]
- 2、向列表右边添加元素
- RPUSH key value [value...]
- 3、查看列表
- LRANGE key start stop
- 4、获取列表中元素的个数
- LLEN key
应用场景:
1、微信文章订阅公众号-->订阅号消息
- 用户uid1024关注公众号d11 d22
- lpush follow:uid1024 d11 d22
- d11 d22发布新文章显示,相当于查看, 0 -1 查看所有
- lrange follow:uid1024 0 -1
redis hash 对应====>java中的结构 Map
- 1、一次设置一个字段值
- HSET key field value
- 2、一次获取一个字段值
- HGET key field
- 3、一次设置多个字段值
- HMSET key field value [field value...]
- 4、一次获取多个字段值
- HMGET key field [field ...]
- 5、获取所有字段值
- HGETALL KEY
- 6、获取某个key内的全部数量
- hlen key
- 7、删除一个key
- hdel key
应用场景:
1、购物车,全选商品,增加商品数量.....
- 新增商品-->hset shopcar:uid1024 334488 1
- 新增商品-->hset shopcar:uid1024 334477 1
- 增加商品数量-->hincrby shopcar:uid1024 334477 1
- 商品总数-->hlen shopcar:uid1024
- 全部选择-->hgsetall shopcar:uid1024
- 1、添加元素
- SADD key member [member...]
- 2、删除元素
- SREM key member [member...]
- 3、获取集合中的所有元素
- SMEMBERS key
- 4、判断元素是否在集合中
- SISMEMBERS key member
- 5、获取集合中的元素个数
- SCARD key
- 6、从集合中随机弹出一个元素,元素不删除 [数字]抽出几个
- SRANDMEMBER key[数字]
- 7、从集合中随机弹出一个元素,出一个删除一个 [数字]抽出几个
- SPOP key[数字]
- 8、集合运算
- 8.1、集合的差集运算A - B 属于A但不属于B的元素构成的集合
- SDIFF key[key ...]
- 8.2、集合的交集运算A ∩ B 属于A同时也属于B的元素构成的集合
- SINTER key[key ...]
- 8.3、集合的并集运算A ∪ B 属于A或者属于B的元素构成的集合
- SUNION key[key ...]
应用场景:
1、微信抽奖小程序
- 1、用户ID,立即参与按钮
- sadd key 用户id
- 2、显示有多少人参与了
- SCARD key
- 3、从集合中随机弹出一个元素,元素不删除 [数字]抽出几个
- SRANDMEMBER key[数字]
- 4、从集合中随机弹出一个元素,出一个删除一个 [数字]抽出几个
- SPOP key[数字]
2、微信朋友圈点赞
- 1、用户ID,新增点赞按钮
- sadd key 点赞用户id 点赞用户id2 点赞用户id3 ...
- 2、取消点赞
- srem key 点赞用户id 点赞用户id2 点赞用户id3 ...
- 3、展现所有点赞过的用户
- SMEMBERS key
- 4、点赞用户数统计,就是常见的点赞红色数字
- scard key
- 5、判断某个朋友是否对楼主点赞过
- SISMEMBERS key 点赞用户id
3、微博好友关注社交关系
- 1、共同关注的人,取交集
- SINTER key1 key2
4、QQ内推可能认识的人
- 1、取差集,我认识的但你不认识的,差集
- SDIFF key1 key2...
- 1、向有序集合中加入一个元素和该元素的分数,添加元素
- ZADD key score member [score member...]
- 2、按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素
- ZRANGE key start stop [WISHSCORES]
- 3、获取元素的分数
- ZSCORE key member
- 4、删除元素
- ZREM key member [member ...]
- 5、获取指定分数范围的元素
- ZRANGEBYSCORE key min max [WISHSCORES][LIMIT offset count]
- 6、增加某个元素的分数
- ZINCRBY key increment member
- 7、获取集合中元素的数量
- ZCARD key
- 8、获得指定分数范围内的元素个数
- ZCOUNT key min max
- 9、按照排名范围删除元素
- ZREMRANGEBYRANK key start stop
- 10、获取元素的排名
- 从小到大 ZRANK key member
- 从大到小 ZREVRANK key member
应用场景:
1、根据商品销售对商品进行排序显示
- 定义商品销售排行榜(sorted set 集合),key为goods:sellsort,分数为商品销售数量
- 1、商品id1001的销售数量是9,商品id1002的销售数量是15
- zadd goods:sellsort 9 1001 15 1002
- 2、有一个客户又买了2件1001的商品
- zincrby goods:sellsort 2 1001
- 3、求商品销售前10名
- zrange goods:sellsort 0 10 withscores
2、抖音热搜
- 1、点击视频
- zincrby hotvcr:20231024 1 孙悟空三打白骨精
- zincrby hotvcr:20231024 15 孙悟空三打白骨精 4 东游记
- 2、展示当前排行前10条
- zrevrange hotvcr:20231024 0 9 withscores
SSM--->SSR
事务介绍
Redis的事务是通过MULTI、EXEC、DISCARD、WATCH这四个命令来完成。
Redis的单个命令都是原子性的,所以这里确保事务性的对象是命令集合。
Redis将命令集合序列化并确保处于一事务的命令集合连续且不被打断的执行。
Redis不支持回滚的操作。
MULTI
注:用于标记事务块的开始
Redis会将后续的命令逐个放入队列中,然后使用EXEC命令原子化地执行这个命令序列
语法:MULTI
EXEC
在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态。
语法:EXEC
DISCARD
清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态。
语法:DISCARD
WATCH
当某个事务需要按条件执行时,就要使用这个命令将给定的键设置为受监控的状态。
语法:WATCH key[key....]
相当于redis的乐观锁
UNWATCH
清除所有先前为一个事务监控的键。
语法:UNWATCH
- 127.0.0.1:6379> set k1 v1
- OK
- 127.0.0.1:6379> set k2 v2
- OK
- 127.0.0.1:6379> MULTI
- OK
- 127.0.0.1:6379> set k1 v11
- QUEUED
- 127.0.0.1:6379> set k2 v22
- QUEUED
- 127.0.0.1:6379> EXEC
- 1) OK
- 2) OK
- 127.0.0.1:6379> get k1
- "v11"
- 127.0.0.1:6379>
WATCH
- redis客户端1:
- 127.0.0.1:6379> set k1 1
- OK
- 127.0.0.1:6379> set k2 2
- OK
- 127.0.0.1:6379> watch k1
- OK
- 127.0.0.1:6379> multi
- OK
- 127.0.0.1:6379> set k1 11
- QUEUED
- 127.0.0.1:6379> set k2 22
- QUEUED
- #此时redis客户端2进行修改k1再继续执行下面的exec,就会执行失败,效果如下
- 127.0.0.1:6379> exec
- (nil)
- 127.0.0.1:6379>
- redis客户端2:
- 127.0.0.1:6379> set k1 aaa
- OK
- 127.0.0.1:6379> get k1
- "aaa"
Redis2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下:
从Redis2.6版本开始,通过内置的Lua解释器,可以使用EVAL命令对Lua脚本进行求值。EVAL命令的格式如下:
- EVAL script numkeys [key [key ...]] [arg [arg ...]]
- summary: Executes a server-side Lua script.
- since: 2.6.0
- group: scripting
script参数是一段Lua脚本程序,它会被运行在Redis服务器上下文中,这段脚本不必定义为一个Lua函数。numkeys参数用于指定键名参数的个数。键名参数[key [key ...]]从EVAL的第三个参数开始算起,表示在脚本中所用到的那些Redis键(key),这些键名参数可以在Lua中通过全局变量KEYS数组,用1为基址的形式访问(KEY[1],KEY[2],依此类推)。
在命令最后,那些不是键名参数的附加参数[arg [arg ...]],可以在Lua中通过全局ARGV数组访问,访问的形式和KEYS变量类似(ARGV[1],ARGV[2],依此类推)。例如
- 127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 k1 k2 f1 f2
- 1) "k1"
- 2) "k2"
- 3) "f1"
- 4) "f2"
其中"return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}"是被求值的Lua脚本,数字2指定了键名参数的数量,k1和k2是键名参数,分别使用KEYS[1]和KEYS[2]访问,而最后的f1和f2则是附加参数,可以通过ARGV[1]和ARGV[2]访问它们。
在Lua脚本中,可以使用redis.call()函数来执行Redis命令
注意:不要在Lua脚本中出现死循环和耗时的运算,否则redis会阻塞,将不接受其他的命令,所以使用时注意不能出现死循环、耗时的运算。Redis是单进程、单线程执行脚本。管道不会阻塞Redis。
一个程序员最重要的能力是:写出高质量的代码!!
有道无术,术尚可求也,有术无道,止于术。
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!