
Redis
文章平均质量分 88
jushisi
一点点好奇心,一点点求知欲
展开
-
解决主从架构的redis分布式锁主节点宕机锁丢失的问题
解决Redis分布式锁业务代码超时导致锁失效问题解决主从架构的redis分布式锁主节点宕机锁丢失的问题普通实现说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道set key value px milliseconds nx。后一种方式的核心实现命令如下:获取锁(unique_value可以是UUID等)SET resource_name unique_value NX PX 30000 释放锁(lua脚本中,一定要比较value,防止误解锁)if redis..转载 2021-01-24 19:24:15 · 9934 阅读 · 3 评论 -
缓存与数据库双写一致性如何解决?先操作数据库,还是缓存?
文章目录一、数据缓存1、为何要使用缓存2、哪类数据适合缓存3、缓存的利与弊二、如何保证缓存和数据库一致性1、不更新缓存,而是删除缓存2、先操作缓存,还是先操作数据库先删缓存,再更新数据库先更新数据库,再删缓存优先“先更新数据库,再删缓存”3、非要保证数据库和缓存数据强一致该怎么办缓存延时双删三、总结一、数据缓存1、为何要使用缓存在我们实际的业务场景中,一定有很多需要做数据缓存的场景,比如售卖商品的页面,包括了许多并发访问量很大的数据,它们可以称作是是“热点”数据,这些数据有一个特点,就是更新频率低,读转载 2021-01-24 17:37:14 · 215 阅读 · 0 评论 -
SpringBoot2整合Redis Cluster
PS:此处用jedis连接池,也可以选择lettuce连接池,参考链接:springboot2.x 整合redis集群的几种方式一、修改pom文件,加入redis相关依赖<!--redis相关--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> &l原创 2020-11-04 10:42:29 · 801 阅读 · 1 评论 -
《Redis开发与运维》---- 缓存设计
文章目录一、缓存的收益和成本分析二、缓存更新策略(三种)实践建议三、缓存粒度控制方法四、缓存穿透解决缓存穿透:五、无底洞问题优化常见的IO优化思路:Redis Cluster四种分布式的批量操作方式六、缓存雪崩预防和解决缓存雪崩问题:七、热点key重建优化(缓存击穿)一、缓存的收益和成本分析收益:加速读写,降低后端负载成本:数据不一致性,代码维护成本,运维成本缓存的使用场景:开销大的复杂计算:以MySQL为例子,一些复杂的操作或者计算(例 如大量联表操作、一些分组计算),如果不加缓存,不但原创 2020-09-12 12:03:24 · 275 阅读 · 0 评论 -
《Redis开发与运维》---- 集群(Redis Cluster)集群伸缩、请求路由、故障转移、集群运维
四、集群伸缩伸缩原理在不影响集群对外服务 的情况下,可以为集群添加节点进行扩容也可以下线部分节点进行缩容。原理:集群伸缩=槽和数据在节点之间的移动扩容集群1)准备新节点。 2)加入集群。 3)迁移槽和数据。1、准备新节点新节点(主、从两个节点)作为孤儿节点运行,并没有其他节点与之通信。2、加入集群新节点依然采用cluster meet命令加入到现有集群中。正式环境建议使用redis-trib.rb add-node命令加入新节点,该命令内部会 执行新节点状态检查,如果新节点已经加入其他集原创 2020-09-08 10:17:21 · 360 阅读 · 0 评论 -
《Redis开发与运维》---- 集群(Redis Cluster)数据分布、搭建集群、节点通信
一、数据分布分布式数据首先要解决把整个数据集按照分区规则映射到多个节点的问题,常见的分区规则有哈希分区和顺序分区两种:常见的哈希分区规则:1、 节点取余分区 客户端分片:哈希+取余使用特定的数据,如Redis的键或用户ID,再根据节点数量N使用公式:hash(key)%N计算出哈希值,用来决定数据映射在哪一个节点。优点:实现简单缺点:当节点数量变化时,比如加入和删除节点,数据节点映射关系需要重新计算,会导致数据的重新迁移。2、 一致性哈希分区 客户端分片:哈希+顺时针为系统中每一个节原创 2020-09-07 17:05:12 · 445 阅读 · 0 评论 -
《Redis开发与运维》---- 哨兵(Redis Sentinel)
文章目录一、基本概念1、主从复制的问题2、传统的高可用3、Redis Sentinel 的高可用二、安装和部署1、具体配置参考自己的命令文档:[https://editor.youkuaiyun.com/md/?articleId=108286324](https://editor.youkuaiyun.com/md/?articleId=108286324)2、以下是本人的sentinel的配置, Redis文件夹下有个默认的`sentinel.conf` 可以参考。3、启动Sentinel节点4、配置优化5、如何监控多个主节点原创 2020-08-30 18:26:35 · 279 阅读 · 0 评论 -
《Redis开发与运维》---- 理解内存
内存消耗1、内存使用统计:info memory重点关注:used_memory_rss、used_memory、mem_fragmentation_ratio(比值)当mem_fragmentation_ratio>1时,说明碎片率严重。当mem_fragmentation_ratio<1时,说明Redis内存交换(swap)到硬盘导致,Redis性能会很差,甚至僵死。2、内存消耗划分Redis进程内消耗主要包括:自身内存(消耗非常少)+对象内存+缓冲内存+内存碎片对象内存原创 2020-08-29 22:55:39 · 227 阅读 · 1 评论 -
Redis三台虚拟机主从、哨兵、集群配置
节点1ip:192.168.164.101# 如果想要除本机以外的机器访问,这里要注释掉# bind 127.0.0.1# 默认:端口port 6379# 默认:保护模式开户protected-mode yes# 保存持久化文件的目录 默认:dir ./dir /usr/local/src/redis-4.0.14# 本节点认证密码requirepass q1w2e3r4t5# 主从:绑主节点slaveof 192.168.164.103 6349# 主节点认证密码原创 2020-09-02 17:11:28 · 495 阅读 · 0 评论 -
《Redis开发与运维》---- Redis的噩梦:阻塞
发现阻塞常见的做法是在应用方加入异常统计并通过邮件/微信/短信报警,以便及时发现通知问题。1、在实现异常统计时要注意,由于Redis调用API会分散在项目的多个地方,每个地方都监听异常并加入监控代码必然难以维护。这可以借助于日志系统,使用logback或者log4j.当异常发生时,异常信息最终会被日志系统收集到Appender,默认的Appender一般是具体的日志文件,开发人员可以自定义一个Appender,用于专门统计异常和触发报警逻辑。2、记得在代码中打印ip和port信息,因为报错信息里没有原创 2020-08-25 23:08:20 · 280 阅读 · 0 评论 -
《Redis开发与运维》---- 主从复制
复制功能是高可用Redis的基础,后面的哨兵和集群都是在复制的基础上实现高可用的。一.配置1、建立复制参与复制的Redis实例划分为主节点(master)和从节点(slave)。默认 情况下,Redis都是主节点。每个从节点只能有一个主节点,而主节点可以同时具有多个从节点。复制的数据流是单向的,只能由主节点复制到从节点。配置复制的方式有以下三种:1)在配置文件中加入slaveof {masterHost} {masterPort}随Redis启动生效。2)在redis-server启动命令后加入原创 2020-08-24 22:20:57 · 188 阅读 · 0 评论 -
《Redis开发与运维》----- 持久化
Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。一、RDB(Redis Data Base 数据快照)二、AOF(Append Only File 操作日志)三、问题定位与优化...原创 2020-08-24 20:32:05 · 187 阅读 · 0 评论 -
《Redis开发与运维》----- 客户端
客户端通信协议客户端与服务端之间的通讯协议是建立在TCP协议之上的。Redis制定了RESP(REdis Serialization Protocol, Redis序列化协议) 实现客户端与服务端的正常交互。客户端管理客户端API1. client list附图id:客户端连接唯一标识addr: 连接的IP和端口fd:socket的文件描述符name:客户端的名字age:客户端已经连接的时间idle:客户端最近一次的空闲时间,当age等于idle时,说明连接一直原创 2020-08-20 13:41:44 · 334 阅读 · 0 评论 -
《Redis开发与运维》----- Java客户端Jedis
maven依赖Jedis直连方式JedisPool方式原创 2020-08-19 22:51:22 · 168 阅读 · 0 评论 -
《Redis开发与运维》----- Pipeline(流水线、管道)、事务与Lua
Pipeline(流水线、管道)Redis客户端执行一次命令,需要经历发送命令、命令排队、命令执行、返回结果四个过程。4个过程统称为一次Round Trip Time (RRT,往返时间)Pipeline(流水线)机制能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端性能测试:执行速度一般比逐条执行要快,客户端和服务端的网络延迟越大,Pipeline的效果越明显原生批量命令和Pipeline对比。原生批量命令是原子原创 2020-08-15 16:18:43 · 436 阅读 · 0 评论 -
《Redis开发与运维》----- 慢查询分析、Bitmaps位图、HyperLogLog、发布/订阅、GEO地理信息定位
慢查询分析慢查询两个参数slowlog-log-slower-than 阀值,单位是微秒(1秒=1000毫秒=1000000微秒),默认值是10000slowlog-log-slower-than=0会记录所有的命令slowlog-log-slowerthan<0对于任何命令都不会进行记录实际上Redis使用了一个列表来存储慢查询日志,slowlog-max-len就是列表的最大长度每个慢查询日志有4个属性组成, 分别是慢查询日志的标识id、 发生时间戳、 命令耗时、 执行命令和参数原创 2020-08-15 11:44:57 · 143 阅读 · 0 评论 -
Redis imgrate迁移键 (error) ERR Target instance replied with error: NOAUTH Authentication required.
当迁移时的目标Redis设置了安全密码时,使用imgrate命令会报错:192.168.164.103:6379> migrate 192.168.164.102 6379 "" 0 1000 keys string hash list set zset(error) ERR Target instance replied with error: NOAUTH Authentication required.可以在migrate中加入auth参数来做权限校验192.168.164.103:6原创 2020-08-11 15:20:04 · 1230 阅读 · 0 评论 -
《Redis开发与运维》---- 集合Set
集合(set)。不允许有重复元素,无序,不能通过索引下标获取元素。一个集合最多可以存储2^32-1个元素。支持集合内的增删改查,集合的交集、并集、差集。命令集合内sadd key element [element ...] # 添加元素srem key element [element ...] # 删除元素scard key # 计算元素个数 时间复杂度O(1),不会遍历集合,取的是redis中存储的一个变量sismember key element # 判断元素是否在集合中,在集原创 2020-08-04 23:31:30 · 176 阅读 · 0 评论 -
《Redis开发与运维》---- 有序集合ZSet
元素可以排序,每个元素设置一个分数(score)作为排序的依据。集合成员(member)不能重复,但是每个元素的score可以重复命令集合内# 添加成员zadd key score member [score member ...]# Redis3.2为zadd命令添加了nx、 xx、 ch、 incr四个选项:# nx: member必须不存在, 才可以设置成功, 用于添加。# xx: member必须存在, 才可以设置成功, 用于更新。# ch: 返回此次操作后, 有序集合元素和分数原创 2020-08-05 14:15:52 · 126 阅读 · 0 评论 -
《Redis开发与运维》---- 列表List
List 有序,可重复Redis中列表(list)类型是用来存储多个有序的字符串,列表中的每个字符串成为元素(element),一个列表最多可以存储2^32 - 1个元素。命令# 添加操作rpush key value [value ...] # 从右向左插入元素lpush key value [value ...] # 从左向右插入元素linsert key before|after pivot value # 向某个元素前/后插入元素,返回结果为当前列表长度# 查找lrange key原创 2020-08-03 23:07:31 · 128 阅读 · 0 评论 -
《Redis开发与运维》---- 哈希Hash
命令hset key field value # 设置值hget key field # 获取值hdel key field # 删除值fieldhlen key # 计算field个数hmget key field [field ...] # 批量获取值hmset key field value [field value ...] # 批量设置值hexists key field # 判断field是否存在hkeys key # 获取所有fieldhvals key # 获取原创 2020-08-02 22:24:50 · 104 阅读 · 0 评论 -
《Redis开发与运维》---- 字符串String
常用命令# 1、设置值set key value [ex seconds] [px milliseconds] [nx|xx]# ex seconds 为键设置秒级过期时间# px milliseconds 为键设置毫秒级过期时间# nx 键必须不存在,才可以设置成功,用于添加# xx 键必须存在,才可以设置成功,用于更新setex key seconds value # 作用同ex seconds setnx key value # 作用同nx# 2、获取值get key#原创 2020-08-02 19:03:40 · 115 阅读 · 0 评论 -
《Redis开发与运维》---- 预备知识
安装命令tar -zxvf redis-4.0.14.tar.gzln -s redis-4.0.14 rediscd redismake && make installredis-cli -v #查看redis版本号启动关闭redis-server --port 6379 # 启动redisredis-server /usr/local/src/redis-4.0.14/redis.conf # 配置文件方式启动 (推荐的启动方式 可以修改redis.con原创 2020-08-02 16:48:22 · 167 阅读 · 0 评论 -
redis保护模式下 启动远程连接
最开始我用 redis-server --port 6379 在103上启动redis,下图是用102去连接103操作报如下错误提示。 说是在保护模式下,要设置密码。原创 2020-07-31 23:28:00 · 440 阅读 · 0 评论 -
Java面试之Redis
179. Redis 是什么?都有哪些使用场景?Redis 是一个使用 C 语言开发的高速缓存数据库。Redis 使用场景:记录帖子点赞数、点击数、评论数;缓存近期热帖;缓存文章详情信息;记录用户会话信息。180. Redis 有哪些功能?数据缓存功能分布式锁的功能支持数据持久化支持事务支持消息队列181. Redis 和 memcache 有什么区别?存储...转载 2020-04-29 16:15:07 · 352 阅读 · 0 评论