Redis
文章平均质量分 87
学习redis
bugcoder-9905
长期更新学习笔记
展开
-
Redis 解决事务冲突之乐观锁和悲观锁
例子:比如说,3个人有你的账户:你有10000元一个人请求想给金额减 8000一个人请求想给金额减 5000一个人请求想给金额减 1000悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁(上锁后不允许其他事务操作),这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁缺点是效率低,只能串行操作乐观锁(Optimistic原创 2022-07-04 12:00:00 · 1845 阅读 · 2 评论 -
Redis 发布和订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息Redis 客户端可以订阅任意数量的频道Redis的发布和订阅(1)客户端可以订阅频道如下图(2)当给这个频道发布消息后,消息就会发送给订阅的客户端发布订阅命令行实践(1)打开一个客户端订阅channel1(2)打开另一个客户端,给channel1发布消息hello注:返回的1是订阅者数量(3)打开第一个客户端可以看到发送的消息注:发布的消息没有持久化,如果在订阅的客户端收不到hello原创 2022-07-04 10:00:00 · 176 阅读 · 0 评论 -
Redis6.0 新功能
Redis ACL 是 Access Control List(访问控制列表)的缩写,该功能允许根据可以执行的命令和可以访问的键来限制某些连接在 Redis 5 版本之前,Redis 安全规则只有密码控制 还有通过 rename 来调整高危命令比如 flushdb,KEYS* ,shutdown 等。Redis 6 则提供 ACL 的功能对用户进行更细粒度的权限控制 :(1)接入权限:用户名和密码(2)可以执行的命令(3)可以操作的 KEY参考官网:https://redis.io/topics/ac原创 2022-07-01 10:30:03 · 2617 阅读 · 0 评论 -
Redis 分布式锁
随着业务发展的需要,原单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的 Java API 并不能提供分布式锁的能力。为了解决这个问题就需要一种跨 JVM 的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!说得通俗些,集群中上了锁后,无论当前操作在哪台机器,所有的机器都会识别并且等待,锁释放后其他操作才能进行,这就是分布式锁,对所有集群里都有效分布式锁主流的实现方案:每一种分布式锁解决方案都有各自的优缺点,其原创 2022-07-01 09:54:03 · 1525 阅读 · 0 评论 -
Redis 缓存穿透、缓存击穿、缓存雪崩
key 对应的数据在redis中并不存在,每次针对此 key的请求从缓存获取不到,请求转发到数据库,访问量大了可能压垮数据库。比如用一个不存在的用户 id 获取用户信息,redis缓存和数据库中都没有,若黑客利用此漏洞进行攻击可能压垮数据库(黑客访问肯定不存在的数据,造成服务器压力大)缓存穿透现象:一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义key 对应的数据存在,但在 redis原创 2022-06-28 23:45:00 · 17281 阅读 · 3 评论 -
Redis 集群
业务发展过程中遇到的峰值瓶颈:这个时候可以使用集群的方式可以快速解决上述问题集群架构: 集群就是使用网络将若干台计算机联通起来,并提供统一的管理方式,使其对外呈现单机的服务效果集群的作用:假定我们现在增加一台机器,这些存储的数据以及空间应该如何分配呢?一台机器分一些槽出来给新的机器,所谓的增加机器和删除机器,改变槽所存储的机器即可此时有一台客户端查找key,首先会通过hash算法计算出key对应的槽编号,然后在哈希环上找到对应的机器,检查这台机器上是否有对应的槽(由于可能进行了机器的增加、删除,机器上的原创 2022-06-23 10:02:28 · 538 阅读 · 0 评论 -
Redis 哨兵
如果master宕机了,哨兵会找一个slave作为master,通知其他所有的slave连接新的master,启动新的master与slave,进行数据同步(全量复制*N+部分复制 *N)这个过程有几个问题:谁来确认master宕机了?用什么方法找一个master?修改配置后,原始的master恢复了怎么办?哨兵(sentinel) :是一个对主从结构中的每台服务器进行监控的分布式系统,当出现故障时通过投票机制选择新的master,并将所有slave连接到新的master;哨兵也是一台redis服务器,只是原创 2022-06-22 17:12:47 · 305 阅读 · 0 评论 -
Redis 主从复制
互联网“三高”架构:高并发、高性能、高可用高可用就是5个9为了避免单点redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服务器上,连接在一起,并保证数据是同步的,即使有其中一台服务器宕机,其他服务器依然可以继续提供服务,实现Redis的高可用,同时实现数据冗余备份多台服务器连接方案假如此时一台slave故障,其他的slave可以对外提供读数据服务,当故障的slave恢复后,也可以从master进行数据恢复假如此时master故障,我们会选择一台slave作为新的master对外原创 2022-06-21 20:14:10 · 588 阅读 · 0 评论 -
Redis 高级数据类型Bitmaps、HyperLogLog、GEO
对于bitmap,我们取值的时候,需要知道bit的位置,改值的时候,需要知道位置和修改结果。取值和修改的操作变得复杂了一些,但是节省了存储空间,属于时间换空间。其实redis并没有提供bitmap这种数据类型,只是提供了对string类型操作bit的接口设置指定key对应偏移量上的bit值,value只能是1或0获取指定key对应偏移量上的bit值如果我们在一个比较大的位设置的时候,这是比较耗时的,同时也耗费空间所以当我们设置的位都很大的时候,我们统一减去一个offset后,再进行setbit电影网原创 2022-06-20 22:02:32 · 435 阅读 · 0 评论 -
Redis 删除策略
Redis中的数据特征: Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态过期的数据真的被删了吗?redis服务器有很多操作需要执行时,CPU的压力会很大,于是redis中的策略是,在内存还够的前提下,先不急着释放已删除的数据的内存空间,先执行客户端的指令redis中的数据删除策略包括定时删除、惰性删除、定期删除redis中用一个hash结构数据存放地址和过期时间,而删除策略就是基于这块hash数据结构我们需要在内存占用与CPU占用之间寻找一种平衡,顾此失彼原创 2022-06-20 17:09:13 · 2804 阅读 · 0 评论 -
Redis 事务和事务锁
Redis执行指令过程中,多条连续执行的指令被干扰,打断,插队,这多条连续指令执行的结果可能就会有问题由于客户端2中断了客户端1两条连续的指令执行,导致客户端1获取到itcastredis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性按照添加顺序依次执行,中间不会被打断或者干扰。一个队列中,一次性、顺序性、排他性的执行一系列命令注意:加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行set执行流程: 正常执行,返回执行结果mu原创 2022-06-20 11:12:06 · 1231 阅读 · 2 评论 -
Redis AOF持久化
RDB存储的弊端AOF解决思路AOF(append only file)持久化:不记录数据,只是以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令达到恢复数据的目的AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式(优先用AOF,再使用RDB)always:每次写入操作均同步到AOF文件中,数据零误差,性能较低,一般不建议使用everysec:每秒将缓冲区中的指令同步到AOF文件中,数据准确性高,性能较高,再系统突然当即的情况下最多丢失1秒内的数据,一般建议使用原创 2022-06-19 23:59:41 · 331 阅读 · 0 评论 -
Redis RDB持久化
什么是持久化?将内存中的数据保存至永久性存储介质称为持久化为什么要持久化?防止数据的意外丢失,确保数据安全性如何防止数据丢失?使用save指令即可通过RBD方式进行数据持久化,需要手动执行save操作,持久化时会把redis中的数据默认保存在dump.rdb中,可在配置文件中指定目录客户端在内存创建数据,并进行save持久化查看指定dump.rbd中是否有内容这就表示内存中的数据已经保存在硬盘文件里了说明:设置本地数据库文件名,默认为dump.rdb经验:通常设置为dump-端口号.rdb原创 2022-06-15 18:05:03 · 1135 阅读 · 0 评论 -
Redis key通用指令
key特征: key是一个字符串,通过key获取redis中保存的数据key应该设计那些操作?删除指定key获取key是否存在获取key的类型为指定key设置有效期获取key剩余的有效时间对于ttl命令的返回值切换key从时效性转换为永久性如果key处于有时效控制的状态,persist可修改key的状态为永久有效;如果key没有时效控制,persist操作失败查询key为key改名对所有key排序,只能对list、set、zset类型排序,不修改数据,只是返回排序结果其他key通用操作原创 2022-06-15 15:35:50 · 256 阅读 · 0 评论 -
Redis 数据类型实践案例
人工智能领域的语义识别与自动对话将是未来服务业机器人应答呼叫体系中的重要技术,百度自研用户评价语义识别服务,免费开放给企业试用,同时训练自己的模型。现对试用用户的使用行为进行限速,限制每个用户每分钟最多发起10次调用解决方案改进解决方案其实就是利用抛出异常的方式提示到达了使用次数使用微信的过程中,当微信接收消息后,会默认将最近接收的消息置顶,当多个好友及关注的订阅号同时发送消息时,该排序会不停的进行交替,同时还可以将重要的会话设置为置顶。一旦用户离线后,再次打开微信时,消息该按照什么样的顺序显示?解决方原创 2022-06-15 12:02:14 · 197 阅读 · 0 评论 -
Redis set和sorted_set数据类型
新的存储需求:存储大量的数据,在查询方面提供更高的效率需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询set类型:与hash存储结构完全相同,底层数据结构使用哈希表,仅存储field,不存储value(nil),并且field不允许重复添加数据获取全部数据删除数据获取集合数据总量判断集合中是否包含指定数据set底层使用的是拉链法哈希表,没有顺序可言(sorted_set底层是跳跃表,有顺序)每位用户首次使用进入头条时候会设置3项爱好的内容,但是后期为了增加用户的活跃度,必须让用原创 2022-06-14 20:25:44 · 758 阅读 · 0 评论 -
Redis list数据类型
这里的索引有点类似于Python,支持负数索引三、扩展命令规定时间内获取并移除数据,当无法获取时会阻塞,直到超时或者获取到元素(要么顺利取出元素,要么超时)list中本就有元素,blpop直接取不用等待list中没有元素,blpop会阻塞等待,要么顺利取出元素,要么超时取不出元素时,阻塞等待10s一旦有另一个客户端push了数据,blpop立马就取出微信朋友圈点赞,要求按照点赞顺序显示点赞好友信息,如果取消点赞,移除对应好友信息一条朋友圈的点赞好友对应一个list,key对应发朋友圈的人,原创 2022-06-14 10:56:13 · 773 阅读 · 0 评论 -
Redis string和hash数据类型
redis自身是一个Map,其中所有的数据都是采用key:value的形式存储,数据类型指的是存储的value的类型,key部分永远都是字符串存储的数据:单个数据,最简单数据存储类型,也是最常用的数据存储类型存储数据的格式:一个存储空间保存一个数据存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用添加/修改多个数据获取多个数据获取数据字符个数(value的长度)追加信息到原始信息后部(如果原始信息存在就追加,否则新建)单数据操作和多数据操作有什么区别?操作同样数据量的情况原创 2022-06-13 17:55:21 · 1757 阅读 · 1 评论 -
认识NoSQL和Redis
NoSQL:Not-Only SQL,泛指非关系型数据库,作为关系型数据库的补充,真正的数据还得是存在硬盘上的关系型数据库,非关系型数据库一般不会用,一般会用在海量用户和高并发的场景下NoSQL特征:可扩容、可伸缩、大数据量下高性能、灵活的数据类型、高可用常见的NoSQL数据库MemcacheRedisMongoDB集群数据库服务器通常以如下形式对外提供数据服务基本信息存放在MySQL数据库,文本类信息存放在MongoDB,图片信息存放在FastDFS,搜索关键字存放在Slor,热点信息存放在Redis,原创 2022-06-13 10:55:18 · 1133 阅读 · 1 评论 -
Redis安装启动和配置文件
下载压缩包后解压,切换到redis目录下,直接执行即可安装完成后,编译出的可执行文件都放在下,执行即可启动redis服务器(默认端口6379)切换端口号启动redis-server我们前面使用的是默认的启动方式,而实际工作中都是使用配置文件的方式来启动redis-server我们先默认启动一下程序给出警告:没有使用redis.conf配置文件,而是使用默认的配置由于redis.conf文件信息过多,我们去掉注释,并且去掉空白,导出主要信息并生成新的配置文件生成的部分内容如下:取出我们需要配置的几项原创 2022-06-13 00:22:48 · 4575 阅读 · 1 评论