![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
redis
介绍redis
Pr Young
一个踏实努力,充满激情的程序员!
展开
-
Redis+Lua脚本防止超卖
redis虽然I/O模块是多线程,但是执行执行命令的时候是单线程的,而且支持多行模式,也就是一个lua脚本里的多行代码认为是一个单个任务,单个命令,前面的任务(命令)不执行完,后面的任务无法执行。超卖就是因为查询库存和扣减库存两个操作不是原子性操作,通过rua脚本执行这两个操作可以保证这两个操作原子性。判断库存量是不是大于等于1,如果大于等于1对库存减1,否则就不去减库存。为什么使用lua脚本可以实现原子性,不会产生并发问题呢?原创 2023-05-21 12:10:20 · 786 阅读 · 0 评论 -
Bitmap
现在使用Bitmap实现统计一个用户一个月签到情况,用31bit来存储,1表示这一天签到了,0表示这一天没有签到。将每一个bit对应一天,1表示签到,0表示这一天没有签到。GetBit:获取offset这个位置的值(0或者1)BitCount:统计BitMap中值为1的bit数量。SetBit:向offset这个位置存入1个0或者1。此时bitmap中存储的就是10101101。返回(integer)1 表示这天签到了。布隆过滤器的底层就是Bitmap。下面表示第一天签到了。原创 2023-05-11 22:05:00 · 362 阅读 · 0 评论 -
本地缓存和redis缓存
本地缓存会占用JVM内存,分布式缓存则存在访问redis服务器的网络时延,所以前者是用内存换速度,后者是用速度换内存。而且ConcurrenHashMap只能自己去移除元素,而Guava有自己的key-value失效策略。先取本地缓存,本地缓存不存在就去redis中取,redis中不存在就去数据库中取,这个就是多级缓存。和ConcurrenHashMap一样是线程安全的。Guava(读作瓜哇):数据缓存到JVM内存中。缓存分为本地缓存与分布式缓存。的方式保存在内存之中,而常见的分布式缓存则有。原创 2023-04-09 22:16:25 · 660 阅读 · 0 评论 -
Redis和mysql如何保持一致性
考虑这种情况:删除了缓存之后,本来要去更新数据库的,此时由于网络原因卡顿了一下,没有去更新数据库,此时查询redis,发现redis里面没有数据,于是去数据库中查询数据,此时数据库没有被更新,所以查到的还是旧值,并且会把查到的旧值保存到redis中,此时,网络卡顿结束,更新数据库操作执行,把新值写入数据库,方案三:更新数据库前,先删除缓存,然后更新数据库,然后用户查询缓存的时候发现redis中没有要查的数据,于是去mysql中查,并且将查询到的数据缓存到redis里面。方案一:先更新缓存,后更新数据库。原创 2023-02-13 00:08:30 · 278 阅读 · 0 评论 -
Redis之使用HyperLogLog统计网站UV
单个HyperLogLog的内存永远小于16kb(内存低的令人发指,作为代价,其结果可能有一定的误差,有小于0.81%的误差,这点误差对于UV统计来说,是完全可以忽略的,比如10000个人,差了80个人,这点误差可以忽略不计的)一个数据集是{1,3,5,7,5,7,8},那么这个数据集的基数集就是{1,3,5,7,8},这个数据集的基数就是5(也就是说数据集去重后的元素个数)PV:Page View 页面访问量,访问一次页面,记录一次,多次打开这个页面,记录多次PV,用来衡量网站的流量。原创 2023-02-03 16:56:50 · 1308 阅读 · 1 评论 -
跳跃表,也称跳表
先是在最顶级的索引(这里是第3级索引)中比较,和A和I进行比较,发现H是处在A-I这个范围之中的,于是去下一级索引里面找。为了改变这个查找慢的弊端,采用空间换时间的策略,给链表加个索引,让链表支持二分查找(也就是说跳表就是带二分查找的链表)所以原始链表有n个元素,一级索引有n/2个元素,2级索引有n/4个元素,3级索引有n/8个元素,....在第一级索引在E和I之间查找,和G作比较,发现在G-I之间,于是去原始链表的G-I之间查找。但是在查找的时候跟数组比起来,速度就比较慢了,因为链表需要从头开始遍历。原创 2023-01-23 23:33:06 · 1227 阅读 · 0 评论 -
黑马redis点评
尽管我们的项目是一个单体的项目,项目部署在单台tomcat上,如果单台tomcat扛不住压力,可以水平扩展,形成一个tomcat集群。然后页面再通过ajax去tomcat中请求数据,数据可能来自redis集群,也可能来自mysql集群。然后后端生成一个验证码,将这个验证码保存在session里面,然后发送短信验证码给这个手机号。一个单体的前后端分离的项目,前端部署在ngnix服务器上,后端部署在tomcat上。最后比较用户输入的验证码和session里的验证码是否是同一个。校验通过,这是个合法的手机号。原创 2023-01-16 11:55:42 · 121 阅读 · 0 评论 -
redis实现分布式锁
多个线程来读的时候,比如两个线程线程1和线程2同时访问stock,都发现stock=1,可是此时一个线程先提交了订单,然后此时库存为0了,另一个线程应该不能再提交订单了,但结果是两个线程都成功提交订单了,于是发生了超卖。点击秒杀之后,会先去redis中查询这个商品的库存,如果此时库存已经小于0,直接返回没有库存,秒杀失败,如果此时库存大于0,就执行提交订单方法。redis 单线程的命令处理机制,多个命令过来了,有个命令队列,先把命令1执行完,然后再执行命令2,再执行命令3......原创 2023-01-14 13:53:45 · 273 阅读 · 0 评论 -
区分缓存击穿,缓存穿透,缓存雪崩
如果每次用户要查的数据都不在缓存里,而是需要查询数据库,这样缓存就根本没有起作用,好像被穿透了一样。构建多个Redis结点,个别节点宕机,依然可以保持服务的整体可用(高可用)一般情况是,先查缓存,缓存中不存在再查数据库。解决方法:布隆过滤器,过滤掉很多不存在的请求。如果用户请求的数据不再缓存中。原创 2022-12-20 13:43:01 · 799 阅读 · 0 评论 -
布隆过滤器
如果查询Lily,将Lily这个词输入到三个哈希函数里面,得到7,12,15,这三个位置上都是1,但是数据库中其实并没有Lily这个词。这里误判率为1%,表示最大允许误判1%,这个数值如果设置的太小,虽然会降低误判率,但是会产生更多次的哈希操作,降低系统性能。将tom这个词输入到三个哈希函数里面,得到0,2,5,发现数组中这三个位置都是0,不是1,说明数据库中不含有tom这个词。假设这个布隆过滤器有3个哈希函数,将Fredy输入到这三个哈希函数,分别得到三个值1,3,7。将这三个位置上的值置为1。原创 2022-12-20 00:13:39 · 313 阅读 · 0 评论 -
Redis大key
大key指的是:key-value这个键值对中,value占的内存太大(比如value是String类型的时候,存储这个value需要10kb以上的空间)或者当value是有序结合Zet,List,Set时,集合里面的成员数量超过5000个。大key的危害:会消耗更多的内存空间,bigkey 对性能也会有比较大的影响(读取大key的value非常耗时),因此,我们应该尽量避免写入 bigkey。一个明星的粉丝列表(用list来实现),必然是大key。所以,说是大key,其实叫大value更贴切。原创 2022-12-19 20:30:32 · 827 阅读 · 0 评论 -
Redis持久化机制
redis中的数据是存储在内存中的,如果突然断电了,那内存中的数据会丢失,持久化数据也就是将内存中的数据写入到硬盘里面,这样即使断电也可以从硬盘中直接写入内存,内存中的数据不会丢失。AOF:记录所有的操作,以日志的形式追加到文件中(当日志文件越来越大的时候,进行重写,它自己会删除一些无效的操作,只保留可以恢复数据的最小指令集)AOF刚好相反,每次对内存操作一次,就要对硬盘操作一次,所以它不会有数据丢失的风险,但是它的性能很差,太慢了。redis重启的时候会去加载这个dump.rdb文件来恢复数据。原创 2022-12-19 16:06:57 · 347 阅读 · 0 评论 -
redis的一些小知识
另外默认16个也是可以更改的,在redis.windows.conf文件里面改(这个文件无法用记事本打开,可以用notepad++打开)默认有16个数据库,选择哪个,可以在客户端redis-cli.exe中使用select index指令选定一个数据库。原创 2022-11-24 14:21:49 · 135 阅读 · 0 评论 -
Redis-server.exe闪退问题
正常开启redis服务,首先要启动redis-server.exe,但是闪退,导致无法开启redis服务。在命令行窗口模式下进入redis所在的路径。原创 2022-11-23 21:58:31 · 2511 阅读 · 0 评论 -
springboot中使用redis
第四步:在application.proprertiees文件中进行配置(连接哪台机器上的redis数据库,本地的还是远程的,用哪个端口进行连接等等)第一步:你要先启动redis(这样springboot才能连接上redis)这时候就会发现0号redis数据库中就多了一条key-value键值对。第二步:打开redis.client即redis客户端。第三步:在pom.xml文件中添加redis依赖。原创 2022-10-28 21:46:15 · 486 阅读 · 0 评论 -
第一篇文章:下载redis
点击redis-server.exe,启动redis。去这个github里面下载redis。原创 2022-10-15 10:41:27 · 184 阅读 · 0 评论 -
第二篇:Redis中的五种数据类型
3.Set集合(value是一个set集合) 注意:set集合是没有顺序的,所以无法判断添加到哪个位置。一个实际的例子:在购物车中,用户的id作为key,商品的id作为field,商品的数量作为value。value为hash的意思就是,value是键值对(有点套娃,redis里面套redis那种感觉)我们说的redis数据类型指的是右边的value部分,key部分永远是字符串。所以list中现在头部是40,然后依次是30,20(跟插入顺序是相反的)可以看到依次往list头部插入的是20,30,40。原创 2022-10-15 13:29:40 · 345 阅读 · 0 评论 -
第三篇文章:Redis可视化客户端
可以在客户端中对数据进行增删改查等操作,使用起来非常方便。客户端与Redis建立连接后会自动选择0号数据库。可以看到Redis默认有16个数据库。下载一个RedisClient。原创 2022-10-15 20:25:51 · 174 阅读 · 0 评论 -
redis的应用场景
2.排行榜 热帖排行,前十个或者前三十个帖子是访问比较频繁的,将这些帖子用redis保存,放到缓存里面,这样访问速度比较快。还有消息队列等.....(但是redis做消息队列不专业,专业的消息队列是kafka)1.缓存 存到内存里面,而不是存到硬盘里面。原创 2022-11-01 22:04:55 · 70 阅读 · 0 评论 -
第0篇文章:redis数据库到底是什么玩意
redis数据库中没有表,就是一个个key-value键值对。比如这台叫做rank的服务器,里面总共有16个redis数据库。第三个键值对key是number,value类型是set。第二个键值对key是age2,value类型是hash。第一个键值对key是age,value类型是list。以0号数据库为例,这个数据库里面有四个键值对。mysql数据库里面是很多张表。原创 2022-10-28 21:19:13 · 102 阅读 · 0 评论 -
第四篇文章:springboot中使用redis
RedisTemplate和StringRedisTemplate这两个类用来对数据进行操作(其中StringRedisTemplate只针对键值是字符串的数据进行操作)opsForValue方法用来操作含有String的数据。opsForList方法用来操作含有list的数据。opsForZSet方法用来操作含有ZSet的数据。opsForHash方法用来操作含有hash的数据。step1:在pom.xml文件中引入所需的依赖。opsForSet方法用来操作含有set的数据。原创 2022-10-15 21:09:03 · 147 阅读 · 0 评论 -
缓存雪崩,缓存穿透
其实cache null策略的核心原理是:在缓存中记录一个短暂的(数据过期时间内)数据在系统中是否存在的状态,如果不存在,则直接返回null,不再查询数据库,从而避免缓存穿透到数据库上。:缓存系统故障或者用户频繁查询系统中不存在(在系统中不存在,在自然数据库和缓存中都不存在)的数据,而这时请求穿过缓存不断被发送到数据库,导致数据库过载,进而引发一连串并发问题。(3)设置不同的失效时间:为不同的数据设置不同的缓存失效时间,防止在同一时刻有大量的数据失效。在缓存数据过多时需要使用某种淘汰算法决定淘汰哪些数据。原创 2022-10-03 00:14:53 · 408 阅读 · 0 评论 -
Redis集群模式(主从模式、哨兵模式和分片模式)
如果哨兵监测到Master主数据库宕机时会自动将Slave从数据库切换成Master主数据库,然后通过发布与订阅模式通知其他从服务器修改配置文件,完成主数据库和从数据库的切换。基于Redis集群的数据复制能力,在集群中的一部分节点失效或者无法进行通信时,Redis仍然可以基于副本数据对外提供服务,这提高了集群的可用性。也就是说这个过程中,主数据库承担写操作和数据同步的任务,而从数据库则可以承当读操作的任务,这样可以缓解整个系统的读压力。一个主数据库可以拥有多个从数据库,从数据库还可以作为其他数据库的主库。原创 2022-10-02 23:35:15 · 1866 阅读 · 0 评论 -
Redis主从复制
以上过程被称为复制初始化(6)在复制初始化结束后,主数据库在每次收到写命令时都会将命令同步给从数据库,从而保证主从数据库的数据一致。(2)主数据库在接收到SYNC命令后会开始在后台保存快照(即RDB持久化的过程),并将保存快照期间接收到的命令缓存起来。(3)在主数据库快照执行完成后,Redis会将快照文件和所有缓存的命令以.rdb快照文件的形式发送给从数据库。(4)从数据库收到主数据库的.rdb快照文件后,载入该快照文件到本地。一个主数据库可以有多个从数据库,而一个从数据库只能拥有一个主数据库。原创 2022-10-02 22:43:07 · 129 阅读 · 0 评论 -
Redis发布订阅(pub/sub)
发送者向频道channel0发送一条消息后,这条消息就会被发送给订阅它的三个客户端sub1,sub2,sub3。1个发送者,1个频道,3个订阅者(3个订阅者都订阅了频道channel0)发送者向频道发送消息,订阅者接受频道上的消息。原创 2022-10-02 22:26:27 · 119 阅读 · 0 评论 -
Redis过期删除策略和内存淘汰机制
非关系型数据库NoSQL存储结构是Key-Value直接存在内存里面,所以读写速度非常快,被用于缓存技术(有些数据更新频率低即不怎么变动,读取频率高,就可以将其存在缓存里面)1.Redis 过期策略使用 定期删除 + 懒惰删除 删除过期的 Key(1)定时删除:对key-value设置一个过期时间,过期时间到达立即删除这个键值对由于删除需要占用cpu,所以会影响速度,所以这就是用时间换空间(2)懒惰删除:键值对到达过期时间,不删除,不做任何处理等到下次访问该数据时,如果没原创 2022-05-21 16:21:20 · 330 阅读 · 0 评论