
08 redis
文章平均质量分 64
redis
喵了个咪的回忆丶
Java后台
展开
-
Redis的五种基本数据类型+两种高级数据类型
前言:Redis 总共有五种基本数据结构,它们的 key 都是唯一的字符串,通过这个唯一的 key 来获取对应的 value 数据。不同类型的数据结构主要不同在它们的 value 结构不同。目录1. Redis 的字符串类型 String:(set,get,setnx,incr,incrby)2. 列表 list:(rpush,lpop,lrange)3. hash(字典)(hset,hget,hlen,hmset 批量set,hincrby 自增)4. Set 集合:(sadd,spop,scard,原创 2020-07-15 14:11:23 · 1493 阅读 · 1 评论 -
redis和数据库的缓存一致性问题
数据库和缓存如何保证一致性先更新数据库,后更新缓存:在并发情况下会存在多线程 写缓存 造成脏数据的问题:假设A、B两个线程,A先更新数据库,B后更新数据库,然后AB分别更新缓存,但是B先更新缓存成功,A后更新缓存成功,这样就导致数据库是最新的数据但缓存中是旧的脏数据。而如果删除缓存数据的话,可以保证下一次读请求回源到数据库,将最新的数据载入到缓存中,避免脏数据的问题。因此,针对数据更新缓存,采用删除缓存的方式进行处理。先删除缓存,再更新数据库:并发问题:删除缓存后,查询操作没有命中缓存,会把老数原创 2020-08-09 14:01:22 · 182 阅读 · 0 评论 -
HyperLogLog、Bitmap
HyperLogLog采用基数算法实现,它设有 16384 个桶进行独立计数,也就是 2 的 14 次方,每个桶占 6 位,2 的 14 次方乘以 6 再除以 8,就等于 12k 字节了。它根据输入元素来计算基数,而不是存储元素本身。占用空间小,无论统计多少个数据,最多占用12K的内存。(redis 设有 16384个桶,每个桶里的数据最多需要6位进行存储,16384 x 6 / 8 约等于...原创 2020-04-09 14:55:31 · 523 阅读 · 0 评论 -
缓存穿透、缓存击穿、缓存雪崩
一、缓存穿透原因: 访问数据时会先访问缓存,如果数据在缓存中不存在,就去访问数据库,但如果数据在数据库中也查询不到,那么这个数据就永远不会写入到缓存中,这就导致,访问不存在的数据时,缓存层形同虚设,每次请求都会打到数据库,造成数据库压力过大。解决方案:采用布隆过滤器保存缓存过的 key,在访问请求到来时可以过滤掉不存在的 key,防止这些请求打到数据库。将空对象保存到缓存层,并设置较短的...原创 2020-04-03 19:08:18 · 207 阅读 · 0 评论 -
持久化机制:RDB,AOF
RDB的具体执行流程;持久化机制具体底层是如何实现的?;RDB AOF,如何配置的;RDB和AOF的原理过程;RDB为什么要 fork 一个子进程;RDB、AOF会记录所有的命令吗,RDB是快照模式,AOF才会记录所有命令;持久化方式RDB和AOF的区别,还有啥缺陷;1. RDB的执行流程RDB持久化功能可以将某个时间点上的数据库状态保存到一个RDB文件中,这是一个二进制文件,通过该文件可以还...原创 2019-10-16 16:44:36 · 620 阅读 · 0 评论 -
主从复制、哨兵、Cluster集群
redis主从复制的原理(过程)主节点执行 bgsave 命令,生成RDB快照文件,并使用一个复制缓冲区记录整个主从同步期间执行的所有写命令。主节点将快照文件发给从节点,从节点收到后执行全量加载,加载之前会将当前内存的数据清空。主节点发送缓冲区的数据给从节点进行增量同步。(复制缓冲区是一个定长的环形数组,如果数组满了,就会从头开始覆盖前面的内容,所以需要为它配置合适的大小参数)...原创 2020-09-01 14:49:32 · 179 阅读 · 0 评论 -
Redis 为什么快?IO多路复用(select,poll,epoll)
Redis 为什么快?Redis 的数据在内存中,所有运算都是内存级别的运算。Redis 是单线程的,避免了线程切换和加锁带来的损耗。Redis 内部有一个文件事件处理器,它是单线程的,由四个部分组成,分别是:IO 多路复用程序、socket、事件分派器和事件处理器,其中事件处理器又分为:连接应答处理器、命令请求处理器和命令回复处理器。Redis 使用 epoll 作为非阻塞 I/O 多路...原创 2020-04-09 15:29:45 · 2060 阅读 · 0 评论 -
2种过期键删除策略、6种淘汰策略、key超时
redis有两种过期键删除策略惰性删除策略:对CPU时间来说是比较友好的,因为程序只会在取出键的时候才对它进行过期检查,删除的目标仅限于当前处理的键,不会在其他无关的过期键上浪费CPU的时间。缺点是对内存不友好,如果数据库中有很多过期键,而它们又恰好没有被访问到,那么它们也许一直不会被删除,这样占用了大量的内存。定期删除策略:指每隔一段时间执行一次删除过期键的操作,并通过限制删除操作执行的时...原创 2019-10-12 15:59:40 · 285 阅读 · 0 评论 -
redis分布式锁
Redis分布式锁可以使用分布式锁来解决程序的并发问题使用 setnx 指令来争抢锁,del 指令来释放锁。为了防止因为异常导致 del 指令没有被调用,从而陷入死锁这种情况,所以拿到锁后还需要通过 expire 指令给锁设置一个过期时间,来保证锁会自动释放。(了解)如果在 setnx 和 expire 之间服务器进程忽然挂掉,导致 expire 指令得不到执行,依然可能产生死锁。可以将...原创 2020-04-09 14:50:43 · 151 阅读 · 1 评论 -
关系型数据库和非关系型数据库
关系型数据库和非关系型数据库的区别非关系型数据库称为NoSQL,以 k-v 键值对的方式将数据存储在缓存中,数据之间没有耦合性,方便进行水平扩展。常见的 NoSQL 有 Redis、Memcached、MongoDB、Hbase。而关系型数据库通过行和列的方式存储数据,这一系列的行和列被称作表,这些表组成了数据库,常见的关系型数据库有 Mysql、Oracle。关系型数据库将数据存放在硬盘中...原创 2020-04-19 15:07:35 · 245 阅读 · 0 评论 -
非关系型数据库 Memcached 和 Redis 的区别
Redis 和 Memcached 的区别(数据类型) Redis 是基于键值对的 NoSql 数据库,支持五种基本的数据类型:String、list、hash、set、zset,以及 HyperLogLog 和 Bitmap 两种高级数据类型,可以适用更多的场景,而 Memcached 仅支持字符串类型,较为单一。(持久化) Redis 支持两种持久化机制:RDB 快照和 AOF 日志,而...原创 2020-04-09 19:48:26 · 237 阅读 · 0 评论 -
一致性hash算法
一致性hash算法(数据均匀分布到各个节点上)普通hash算法的缺点:普通的hash算法将key的hash值对redis实例的个数进行取模,来定位到redis,这样会有一些问题,比如redis实例增加,这个计算公式就会变,于是要将之前存储的key重新hash一遍,这样代价是比较高的。一致性hash算法也是使用取模的方法,不过不是对服务器数量取模,而是对2的32次方取模,hash函数的值空间为0~2的32次方-1,将整个hash值空间看成一个虚拟的圆环。将每台服务器(ip地址)都hash到hash原创 2020-08-13 15:13:23 · 138 阅读 · 0 评论 -
Redis的近似LRU算法
LRU 算法LRU算法需要在原有结构上附加一个链表。当某个元素被访问时,它在链表中的位置就会被移动到表头,这样位于链表尾部的元素就是最近最少使用的元素,优先被踢掉;位于链表头部的元素就是最近刚被使用过的元素,暂时不会被踢。Redis 的近似 LRU 算法Redis 使用的是一种近似 LRU 算法,之所以不用传统的 LRU 是因为它引入了链表,会占用较多的内存。近似 LRU 算法在现有...原创 2020-04-19 12:19:53 · 2168 阅读 · 0 评论 -
LRU的实现(手撕)
import java.util.LinkedHashMap;import java.util.Map;public class LRU { class LRUCache extends LinkedHashMap<Integer, Integer> { private int capacity; //最多能缓存多少数据 public L...原创 2019-10-28 13:23:04 · 557 阅读 · 0 评论 -
布隆过滤器
redis中采用布隆过滤器辅助存储在磁盘中的索引,加速了数据查找效率布隆过滤器具有一定的判错率。对于判定存在的数据,有可能并不存在,但是对于判定不存在的数据,那肯定就不存在。而且,布隆过滤器还有一个更大的特点,那就是内存占用非常少。可以针对数据,构建一个布隆过滤器,存储在内存中。当要查询数据的时候,可以先通过布隆过滤器,判定是否存在。如果通过布隆过滤器判定数据不存在,那就没有必要读取磁盘中的索引...原创 2019-12-09 15:26:50 · 136 阅读 · 0 评论 -
Redis的应用场景
Redis的应用场景缓存:对于访问频繁的数据,如果存到硬盘上进行访问就会很慢,可以采用redis将它缓存在内存中,速度会很快。排行榜:通过redis的有序集合类型,sorted set,将热门的帖子缓存在redis中,热门的帖子访问量很高,采用redis可以提高效率。社交网络中的点赞:比如很多人会对热门的帖子进行点赞或关注,通过redis以键值对的形式存到内存中可以提高效率。计数器:使用redis的字符串类型中的 incr 和 incrby 方法进行技术。incr表示自增1,incrby ag原创 2020-09-10 12:24:55 · 165 阅读 · 0 评论 -
秒杀项目中redis的交易验证和库存扣减
交易验证将用户信息和商品信息缓存在redis中,然后下单请求到来时,会先在redis中进行一个校验操作,具体是校验用户信息是否合法、商品信息是否存在。库存扣减先在redis中通过 increment 进行库存的扣减,increment 是一个原子操作,它可以避免并发情况下多个线程对库存进行扣减时产生的数据不一致的问题。比如此时库存为1,进行扣减后为0,扣减成功,而再进行减库存时,库存会变为-1,这里会进行判断,判断库存是否大于等于0,如果大于等于则表示扣减成功,小于0则表示扣减失败。每次扣减成原创 2020-08-09 12:29:28 · 1918 阅读 · 0 评论 -
redis基本数据类型——①字符串String
1. 简单动态字符串 SDS (simple dynamic string)redis将简单动态字符串SDS用作它默认的字符串表示。比如在redis数据库中,包含字符串值的键值对在底层都是由SDS实现的。SDS遵循C字符串以空字符结尾的惯例,这样做的好处是SDS可以直接重用一部分C字符串函数库里的函数。SDS的功能:保存数据库中的字符串值用作缓冲区:比如AOF模块中的AOF缓冲区,以及...原创 2019-10-10 15:00:30 · 155 阅读 · 0 评论 -
redis基本数据类型——②列表
redis中链表是什么结构的?双端:链表节点带有pre和next指针,获取某个节点的前置和后置节点的时间复杂度都是O(1)无环:表头节点的pre指针和表尾节点的next指针都指向null带表头指针和表尾指针带链表长度计数器多态:可以通过list结构的dup、free、match三个属性为节点值设置类型特定函数,所以redis的链表可以保存各种不同类型的值。字典redis用字典来...原创 2019-10-10 21:21:35 · 150 阅读 · 0 评论 -
redis基本数据类型——③哈希(字典)
hash(字典)Redis 的字典相当于 Java 中的 HashMap。Redis 的字典与 HashMap 的相同点:无序,采用的数组 + 链表的结构,数组位置碰撞时,将碰撞的元素使用链表串接起来。不同点:Redis 字典的值只能是字符串,而 HashMap 的值可以是多种类型。另外它们 rehash 的方式不一样,因为 HashMap 在字典很大时,一次性全部 rehash 会是一个...原创 2020-01-12 00:24:18 · 257 阅读 · 0 评论 -
redis基本数据类型——④集合set
Set 集合:(sadd,spop,scard,smembers)Redis 的集合相当于一个特殊的字典,所有 value 值都是 null。它的键值对是无序而且唯一的,所以 set 结构可以用来存储活动中奖的用户 ID,因为有去重功能,可以保证同一个用户 ID 不会中奖两次。sadd book javaspop book (弹出一个)scard book (获取长度,类似 count...原创 2020-04-09 11:51:35 · 111 阅读 · 0 评论 -
redis基本数据类型——⑤有序集合 zset(跳跃表+hash)
跳跃表的结构:redis的跳跃表由 zskiplist 和 zskiplistNode 两个结构组成,其中 zskiplist 用于保存跳跃表的信息,比如表头表尾节点、表中节点的数量、层数最大节点的层数;而 zskiplistNode 用于表示跳跃表节点。跳跃表的时间复杂度为O(logn):标准化的跳表每两个元素提取出一个元素作为上一级的索引,也就是开始是1/2,然后1/4,1/8 … ,每一级...原创 2019-10-11 20:52:27 · 1741 阅读 · 1 评论 -
使用Redis实现实时排名
redis实现排行转载 2019-12-03 20:56:54 · 554 阅读 · 0 评论 -
了解内容:geoHash,scan
GeoHash 实现附近的人GeoHash 算法将二维的经纬度数据映射成一维的整数,这样所有的元素都将挂载到一 条线上。这样实际距离相近的目标,它们的二维坐标映射到一维的点的距离也会很接近。当我们想要计算附近的人时,首先将目标位置映射到这条线上,然后在这个一维的线上获取附近的点就行了。大致的映射方法是将二维平面划分成一系列正方形的方格,所有地图坐标放置在唯一的一个方格中,每个正方形方格可以标...原创 2020-04-09 15:02:28 · 197 阅读 · 0 评论