没有合适的资源?快使用搜索试试~ 我知道了~
Redis入门 (脑图)
资源推荐
资源详情
资源评论
Redis
五大数据类型
String
简介 Redis中最基本的类型,一个key对应一个value,一个字符串Value最多可以是512M
常用命令
set key value 添加键值对
get key 查询该键对应的值
append key value 将指定的value追加到原值的末尾
strlen key 获取值的长度
setnx key value
设置键值,当没有该键时才会设置成功(可用于在客户端中充当分布式集群的锁
对象)
incr key 将key中储存的数值 +1 ,只能对数字值操作,如果为空,新增值为 1
decr key 将key中储存的值 -1 ,只能对数字值操作,如果为空,新增值为-1
incrby / decrby key 步长 将 key 中储存的数字值增减。自定义步长
mset key1 value1 key2 value2 ...... 同时设置一个或多个键值
mget key1 key2 key3 同时获取一个或多个key的value
msetnx key1 value1 key2 value2 ...... 同时设置一个或多个 键值 对,当且仅当所有给定 key 都不存在
getrange key 起始位置 结束位置 获得范围内的值,类似 java 中的 substring,前包,后包
setrange key 起始位置 value 用 <value> 覆写<key>所储存的字符串值,从<起始位置>开始(索引从0 开始),新值有几位,就替换掉几个字符。
setex key time value 设置键值,同时设置过期时间,单位为秒
getset key value 以旧换新,获取旧值,同时设置新值
List
简介
列表,单键多值,Redis的list是简单的字符串列表,按照插入顺序,可以添加元素到列表的头部(左边)或尾部(右边)Redis的list底层是一个双向链表,
对两端的操作性能很高,操作中间的节点性能会较差
常用命令
lpush/rpush key value1 value2 value3 从左边/右边插入一个或多个值
lpop/rpop key 从左边/右边取出值,值在键在,值光键亡
rpoplpush key1 key2 从key1 列表的右边取一个值,插入到key2列表的左边
lrange key start stop
按照索引下标获取值 (从左往右)lrange key 0 -1 : 0表示左边第一个,-1表
示右边第一个 ,0 -1 即取出所有
lindex key index 按照索引下标获取元素
llen key 获取该key对应的列表的长度
linsert key before/after value newvalue : 在列表中指定的value之前/后插入新的元素,如果元素有重复的,会在第一个元素之前/后插入
lrem key n value 从左边删除n个value
lset key index value 将列表下表为index的值替换成命令中的value
数据结构
List在元素较少的情况下会使用一块连续的内存存储,称为ziplist(压缩列表),当元素较多时,会改用quicklist(快速列表),
这个quicklist是Redis将多个ziplist用双向指针连接起来所组成的
Set
简介
集合,功能与List类似,但是Set可以去重,且Set可以判断某个成员在不在集合内,Redis的Set是String类型的无序集合,
底层实际是一个value为null的哈希表
常用命令
sadd key value1 value2 ...... 新增元素,已经存在的元素将被忽略
smembers key 取出该集合的所有值
sismember key value 判断集合key是否含有该value,没有返回0,有则返回1
scard key 返回该集合的元素个数
srem key value1 value2 ...... 删除集合中的某个元素
spop key 随机从集合中取出一个值
srandmember key n 随机从集合中取出n个元素
smove source destination value 将一个集合中的值移动到另一个集合中
sinter key1 key2 返回两个集合的交集元素
sunion key1 key2 返回两个集合的元素的并集
sdiff key1 key2 返回两个集合中的差集元素,即集合key1中有,但是集合key2中没有的
数据结构 Redis 的 Set 内部使用的是 hash 结构,所有的value 都指向同一个内部值。
Hash
简介 Redis的hash是一个String类型的field和value的映射表,特别适合用于存储对象,类似 Java 里面的 Map<String,Object>
存储方式
通过key + field 就可以获取到对应的value了
常用命令
hset key field value 在集合key中新增元素,元素有field和value
hget key field 从集合key中取出field对应的值
hmset key field1 value1 field2 value2 ...... 批量设置hash集合中的键值
hexists key field 查看key哈希表中,给定域 field 是否存在
hkeys key 获取该hash集合中所有的field
hvals key 获取该hash集合中所有的value
hincrby key field increment 为hash表key中的field域的值加上增量
hsetnx key field value 为hash表key新增field域及对应的值,当且仅当该field域不存在时才可以
数据结构
Hash 类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。
当field-value 长度较短且个数较少时,使用 ziplist,否则使用 hashtable。
Zset(有序集合)
简介
Redsi的有序集合zset与set集合十分的相似,也是一个没有重复元素的字符串集合,不同之处在于
zset的每个成员都关联了一个评分(score),成员按照score评分由低到高进行排序,集合的成员
是唯一的,但是评分可以是重复的 。因为元素是有序的, 所以可以快速的根据评分(score)或者
次序(position)来获取一个范围的元素。
常用命令
zadd key score1 value1 score2 value2 ...... 将一个或多个元素及其 score 值加入到有序集 key 当中
zrange key start stop [WITHSCORES] 返回有序集 key 中,下标在start-stop之间的元素,加上 WITHSCORES 可以让分数一起和值返回到结果集
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于min 或max )的成员。
[WITHSCORES] 和 [LIMIT offset count] 都是可选择参数,其中limit的offset表示结果列
表的起始位置(偏移量),count是要返回的元素数量,加上WITHSCORES 可以让分数
一起和值返回到结果集 ,而加上 [LIMIT offset count] 如 limit 3 5 则表示从列表第三个
下标开始返回5个值
zrevrangebyscore key max min [withscores] [limit offset count] 同上,只不过是从大到小
zincrby key increment value 为元素的score加上增量
zrem key value 删除该集合下,指定值的元素
zcount key min max 获取该集合指定分数区间内的元素个数
zrank key value 返回该值在集合中的排名(从0开始)
数据结构
hash,hash 的作用就是关联元素 value 和权重 score,保障元素value 的唯一性,
可以通过元素 value 找到相应的 score 值。
跳跃表,跳跃表的目的在于给元素 value 排序,根据score 的范围获取元素列表。
部分配置文件详解
. ### INCLUDES ### 多实例的情况可以把公用的配置文件提取出来
bind
bind 参数用于指定Redis服务器监听的网络接口和IP地址。这个参数控制Redis服务器绑定到哪些网络接口或IP地址上,
以便接受客户端的连接请求。默认情况下bind是被注释掉的,即允许Redis服务器监听所有可用的网络接口和IP地址,
相当于配置了bind 0.0.0.0,对于bind我们可以同时配置多个IP地址,如bind 127.0.0.1 192.168.1.100
protected-mode
Redis的保护模式,protected-mode yes即为开启protected-mode no 即为关闭,通常当我们需要远程
访问Redis或客户端应用程序需要连接Redsi时需要将保护模式关闭,但关闭保护模式不是很安全,记得设
置密码,防止服务器被攻击然后用来挖矿
Port 端口号,Redis默认端口号为6379
timeout 一个空闲的客户端维持多少秒会关闭,0 表示关闭该功能。即永不关闭
daemonize
daemonize是一个配置选项,用于指定Redis是否以守护进程的方式启动。守护进程是指在后台运行的进程,
不依赖于终端(terminal)会话,并且通常用于长时间运行的服务。默认情况下,daemonize的值为no
pidfile 存放 pid 文件的位置,每个实例会产生一个不同的 pid 文件
loglevel
指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默认为 notice
四个级别根据使用阶段来选择,生产环境选择 notice 或者 warning
logfile 日志文件名称
databases 16
设定库的数量 默认 16,默认数据库为 0,可以使用 SELECT <dbid>命令在连接
上指定数据库 id
. ### SECURITY ###
requirepass默认是注释掉的,而在命令中设置密码,只是临时的。重启 redis 服
务器,密码就还原了。永久设置,需要再配置文件中进行设置。
#### LIMITS ###
maxclients
设置 redis 同时可以与多少个客户端进行连接。默认情况下为 10000 个客户端。
如果达到了此限制,redis 则会拒绝新的连接请求,并且向这些连接请求方发
出“max number of clients reached”以作回应。
maxmemory
设置 redis 可以使用的内存量。一旦到达内存使用上限,redis 将会试图移除内部数据,
移除规则可以通过 maxmemory-policy 来指定。
maxmemory-policy
maxmemory-policy是一个配置选项,用于指定在达到最大内存限制
(由maxmemory选项设置)时,Redis应该采取什么策略来淘汰键
值对以释放内存空间。
noeviction(默认值)
当内存达到上限时,Redis将拒绝执行写操作(如SET)并返回错误。这意味着
Redis将停止接受新数据,直到释放足够的内存空间为止。这个策略适用于确保
Redis不会超出内存限制的场景,但会导致写操作失败。
allkeys-lru
使用最近最少使用(LRU)算法来淘汰键值对。Redis将尝试淘汰最近最少被访问
的键,以腾出内存空间。
volatile-lru
只对设置了过期时间(TTL)的键使用LRU算法。这意味着只有具有过期时间的键
才会被淘汰。
allkeys-lfu
使用最不常用(LFU)算法来淘汰键值对。Redis将尝试淘汰最不常被访问的键,
以腾出内存空间。
volatile-lfu
只对设置了过期时间(TTL)的键使用LFU算法。这意味着只有具有过期时间的键
才会被淘汰。
volatile-ttl 根据键的过期时间(TTL)来淘汰键值对。Redis将优先淘汰那些即将过期的键。
volatile-random 随机淘汰设置了过期时间(TTL)的键。
allkeys-random 随机淘汰任何键值对。
volatile-lfu 根据键的LFU值来淘汰键值对。LFU值表示键被访问的频率。
maxmemory-samples
设置样本数量,LRU 算法和最小 TTL 算法都并非是精确的算法,而是估算值,所以
你可以设置样本的大小,redis 默认会检查这么多个 key 并选择其中LRU的那个。
一般设置 3 到 7 的数字,数值越小样本越不准确,但性能消耗越小。
发布与订阅
简介
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅
者(sub) 接收消息。Redis 客户端可以订阅任意数量的频道。频道也可以被任意数
量的客户端订购,当给这个频道发布消息后,消息就会发送给订阅的客户端
Redis6新数据类型
Bitmaps 简介 Redis 提供了 Bitmaps 这个“数据类型”可以实现对位的操作
. HyperLogLog 简介
Redis的HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在
输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且
是很小的。
Geospatial 简介
Redis 3.2 中增加了对 GEO 类型的支持。GEO,Geographic,地理信息的缩
写。该类型,就是元素的 2 维坐标,在地图上就是经纬度。redis 基于该类型,
提供了经纬度设置,查询,范围查询,距离查询,经纬度 Hash 等常见操作。
事务
简介
Redis 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执
行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。Redis
事务的主要作用就是串联多个命令防止别的命令插队。
Multi、Exec、discard
从输入 Multi 命令开始,输入的命令都会依次进入命令队列中,但不会执行,直
到输入Exec 后,Redis 会将之前的命令队列中的命令依次执行。
组队的过程中可以通过 discard 来放弃组队。
事务的错误处理
组队中某个命令出现了报告错误,执行时整个的所有队列都会被取消。
如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命
令都会执行,不会回滚。
乐观锁
每次取数据都认为别人没有修改过数据,但是维护一个版本号,取数据时会核对
版本号是否一致,一致则说明没被修改过,不一致则说明被修改过,那就重新查
询数据,乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis 就是利用
这种 check-and-set 机制实现事务的。
常用命令
WATCH key1 key2 ......
在执行 multi 之前,先执行 watch key1 key2,可以监视一个(或多个) key ,如果
在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
unwatch
取消 WATCH 命令对所有 key 的监视。
如果在执行 WATCH 命令之后,EXEC 命令或 DISCARD 命令先被执行了的话,
那么就不需要再执行 UNWATCH 了。
可能存在的问题
(以秒杀系统举例)
库存余留问题
在使用乐观锁的情况下,查询操作和修改操作不是原子的,而是在两个步骤之间
存在一个时间窗口。在高并发环境中,多个线程或客户端可以同时完成查询操
作,然后同时尝试修改库存,从而导致库存没有正确减少的问题
解决方案 LUA脚本
悲观锁
每次取数据都认为数据会被人修改,所以每次取数据都会上锁,这样别人就无法
修改数据,直到锁被释放,传统的关系型数据库里边就用到了很多这种锁机制,
比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
持久化
RDB
简介
在指定的时间间隔内将内存中的数据集快照写入磁盘,它恢复时是将快照文件直
接读到内存里,Redis的RDB属于全量复制
原理
Redis 会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临
时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文
件。整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能 如果
需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方
式要比AOF 方式更加的高效
缺点
Fork 的时候,内存中的数据被克隆了一份,大致 2 倍的膨胀性需要考虑
虽然 Redis 在 fork 时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性
能。
在备份周期在一定间隔时间做一次备份,所以如果Redis 意外down 掉的话,就
会丢失最后一次快照后的所有修改。
何时执行
save Redis客户端手敲save命令,Redis会让主线程来执行RDB,会阻塞所有命令
bgsave
Redsi客户端手敲bgsave命令,Redis会开启子进程执行RDB,避免主进程受到影
响
正常退出 Redis停机的时候,会执行一次save命令,实现RDB持久化
配置文件设置
save time num
在距离上一次备份time秒后,并且至少有num个键有改动(新增修改删除),
Redis就会执行RDB持久化(采用bgsave的方式)
AOF
简介
以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记
录下来(读操作不记录), 只许追加文件但不可以改写文件,redis 启动之初会读取
该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从
前到后执行一次以完成数据的恢复工作
AOF默认是不开启的
当AOF 和 RDB 同时开启,系统默认取 AOF 的数据(数据不会存在丢失)
持久化流程
(1)客户端的请求写命令会被 append 追加到 AOF 缓冲区内;
(2)AOF 缓冲区根据 AOF 持久化策略[always,everysec,no]将操作sync 同到
磁盘的AOF 文件中;
(3)AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件rewrite 重写,
压缩AOF 文件容量;
(4)Redis 服务重启时,会重新 load 加载 AOF 文件中的写操作达到数据恢复
的目的
同步频率
appendfsync always 始终同步,每次 Redis 的写入都会立刻记入日志;性能较差但数据完整性比较好
appendfsync everysec 每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失
appendfsync no redis 不主动进行同步,把同步时机交给操作系统
主从复制
简介 主机数据更新后根据配置和策略, 自动同步到备机的机制
优点
读写分离,提高性能
容灾快速恢复
常用命令
info replication 打印主从复制的相关信息
slaveof ip port 成为某个实例的从服务器(在从机上执行)
注意
主机挂掉,重启就行,一切如初
从机如果down掉则需要重新slaveof
不过我们可以将配置增加到文件中,永久生效
哨兵模式
简介 能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
配置 sentinel monitor mymaster 127.0.0.1 6379 1 其中 mymaster 为监控对象起的服务器名称, 1 为至少有多少个哨兵同意迁移的数量。
启动 执行 redis-sentinel /myredis/sentinel.conf
选举 当主机挂掉,会从从机中选举一位新主机,原主机重启后会变为从机。 选举条件
1.根据优先级别:slave-priority来选举,值越小优先级越高。(slave-priority在配置文件中设置)
2.选择偏移量最大的(偏移量是指获得原主机数据最全的)
3.选择runid最小的服务(每个 redis 实例启动后都会随机生成一个 40 位的 runid)
缺点 复制延时
由于所有的写操作都是先在 Master 上操作,然后同步更新到 Slave 上,所以从Master同步到 Slave 机器有
一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
子主题6
集群
简介
Redis 集群实现了对 Redis 的水平扩容,即启动 N 个 redis 节点,将整个数据库
分布存储在这 N 个节点中,每个节点存储总数据的 1/N。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability):即
使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
优点
容量不够,通过集群进行扩容
分摊并发写操作
无中心化集群配置,解决ip 地址发生变化时,应用程序中配置需要修改对应的主
机地址、端口等信息
配置
daemonize yes 后台运行
cluster-enabled yes 打开集群模式
cluster-config-file nodes-6379.conf 设定节点配置文件名
cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
启动集群
例:redis-cli --cluster create --cluster-replicas 1 192.168.11.101:6379
192.168.11.101:6380 192.168.11.101:6381 192.168.11.101:6389
192.168.11.101:6390 192.168.11.101:6391
介绍
这边这6个IP应该改成自己6太服务器的IP加上Redis的端口号
-replicas 1 表示采用最简单的方式配置集群,一台主机,一台从机,正好三组
Redis集群主机是由Redis自己分配的,而非我们指定的
登录 集群登录需要加上-c 例:redis-cli -c -p 6379
slots 简介
一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这16384个插
槽的其中一个
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽,其中CRC16(key) 语句用于
计算键 key 的 CRC16 校验和 。
集群中的每个节点负责处理一部分插槽。
缺点
多键操作是不被支持的
多键的 Redis 事务是不被支持的。lua 脚本不被支持
应用问题
缓存穿透
简介
key 对应的数据在数据源并不存在,每次针对此 key 的请求从缓存获取不到,请求都会压到
数据源,从而可能压垮数据源。比如用一个不存在的用户id 获取用户信息,不论缓存还是数
据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
解决方案
对空值缓存
如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结
果(null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟
设置可访问的名单(白名单)
使用 bitmaps 类型定义一个可以访问的名单,名单 id 作为bitmaps 的偏移量,
每次访问和 bitmap 里面的 id 进行比较,如果访问 id 不在bitmaps 里面,进行
拦截,不允许访问。
布隆过滤器
(布隆过滤器(Bloom Filter)是1970 年由布隆提出的。它实际上是一个很长的
二进制向量(位图)和一系列随机映射函数(哈希函数)。
布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查
询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。)
实时监控
当发现 Redis 的命中率开始急速降低,需要排查访问对象和访问的数据,和运维
人员配合,可以设置黑名单限制服务
缓存击穿
简介
key 对应的数据存在,但在 redis 中过期,此时若有大量并发请求过来,这些请求发现缓
存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把
后端 DB 压垮。
解决方案
预先设置热门数据
在 redis 高峰访问之前,把一些热门数据提前存入到redis 里面,加大这些热门数
据 key 的时长
实时调整 现场监控哪些数据热门,实时调整 key 的过期时长
锁
只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存获
取数据即可
缓存雪崩
简介
key 对应的数据存在,但在 redis 中过期,此时若有大量并发请求过来,这些请求发现缓
存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把
后端 DB 压垮。
缓存雪崩与缓存击穿的区别在于这里针对很多 key 缓存,前者则是某一个key
解决方案
构建多级缓存架构
采用多级缓存,本地进程作为一级缓存,redis作为二级缓存,不同级别的缓存设
置的超时时间不同,即使某级缓存过期了,也有其他级别缓存兜底
例如:nginx 缓存 + redis 缓存 +其他缓存(ehcache 等)
缓存预热
可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发
加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
锁或队列
在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某
个key只允许一个线程查询数据和写缓存,其他线程等待。
业界比较常用的做法,是使用mutex。简单地来说,就是在缓存失效的时候(判
断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操
作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个
mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重
试整个get缓存的方法。
分布式锁
简介
随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于
分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的
并发控制锁策略失效,单纯的 Java API 并不能提供分布式锁的能力。
主流实现方案
基于数据库实现分布式锁
基于缓存(Redis 等)
客户端中可以通过setnx这个命令来实现分布式锁
在Redis中,锁是一个抽象的概念,通常由应用程序或客户端来管理和使用。
Redis本身提供了基本的命令(如SETNX)来实现锁的机制
1.0版本
简单实现
通过这行代码 Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", "111");
客户端会操作Redsi执行setnx lock 111 这条命令,如果数据库中没有该key则会返回true,否则为flase,
通过if判断lock返回的是true还是false,实现抽象的锁,返回true则执行if中的操作
执行完通过 redisTemplate.delete("lock"); 这行代码删除redis中的这个key 实现抽象意义上的释放锁
存在的问题
因为这是手动释放锁的,如果业务逻辑出现异常,导致无法删除该key,即无法释
放锁,则会造成阻塞。
解决方案 通过设置key的过期时间来解决
2.0版本
简单实现
Boolean lock = redisTemplate.opsForValue().setIfAbsent(locKey, uuid, 3, TimeUnit.SECONDS);
设置过期时间,超过时间key自动过期从而防止阻塞
存在的问题
虽然设置了过期时间,但是试想一下以下情景,在高并发情况下:
A服务获取锁,然后执行业务,但是业务代码还没执行完,过期时间到了,锁被释放了,
然后B任务获取到了锁,但是A任务仍在执行业务,执行到随后会进行释放锁操作,然后
删除数据库中的lock数据,但是现在lock是服务B的,这就导致了误删
解决方案 UUID 防误删
3.0版本
简单实现
String uuid = UUID.randomUUID().toString();
声明一个uuid ,将做为一个value 放入我们的key所对应的值中
在执行删除key那边先判断lock的value是否和本业务中生成的uuid一样,相等则
执行if语句中的代码,进行删除操作
存在的问题
由于操作不具备原子性,试想一下,A服务在if判断刚好成功准备执行删除操作时,key过期了,
然后B服务获取到了锁,然后A服务删除锁,
在这种极端情况下,仍会误删
解决方案 LUA 脚本
4.0版本 简单实现
/*使用lua脚本来锁*/
// 定义lua 脚本
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
// 使用redis执行lua执行
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
redisScript.setScriptText(script);
// 设置一下返回值类型 为Long
// 因为删除判断的时候,返回的0,给其封装为数据类型。如果不封装那么默认返回String 类型,
// 那么返回字符串与0 会有发生错误。
redisScript.setResultType(Long.class);
// 第一个要是script 脚本 ,第二个需要判断的key,第三个就是key所对应的值。
redisTemplate.execute(redisScript, Arrays.asList(locKey), uuid);
基于 Zookeeper
常见的操作
keys * :查看当前库所有 key
exits key :判断某个key是否存在
type key :查看key是什么类型的
del key :删除key
unlink key :异步删除键
expire key time :为给定的key设置过期时间(时间单位默认是秒)
如果要使用毫秒,可以使用命令 :pexpire key time
ttl key :查看key还有多少剩余时间(-1代表永不过期,-2代表已过期)
dbsize : 查看当前数据库的key的数量
select : 切换数据库
flushdb : 清空当前库
flushall :通杀全部库
作 者 : @ L S C z N C 7 R | 来 自 : 知 犀 思 维 导 图
资源评论
空的蝉壳悄悄摇落
- 粉丝: 4
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功