简介:String是Redis中最常见的数据存储类型:其基本编码方式是RAW,基于简单动态字符串(SDS)实现,存储上限为512mb。如果存储的SDS长度小于44字节,则会采用EMBSTR编码,此时object head与SDS是一段连续空间。申请内存时只需要调用一次内存分配函数,效率更高。底层实现:底层实现⽅式:动态字符串sds 或者 longString的内部存储结构⼀般是sds(Simple
动态字符串SDS我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:V获取字符串长度的需要通过运算V非二进制安全V不可修改Redis构建了一种新的字符串结构,称为简单动态字符串( Simple Dynamic String) ,简称SDS。例如,我
Redis集群本章是基于CentOS7下的Redis集群教程,包括:单机安装RedisRedis主从Redis分片集群1.单机安装Redis首先需要安装Redis所需要的依赖:yum install -y gcc tcl例如,我放到了/tmp目录:解压缩:tar -xzf redis-6.2.4.tar.gz解压后:进入redis目录:cd redis-6.2.4运行编译命令:make &
持久化配置Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:①用来做缓存的Redis实例尽 量不要开启持久化功能②建议关闭RDB持久化功能,使用AOF持久化③利用脚本定期在slave节点做RDB,实现数据备份④设置合理的rewrite阈值,避免频繁的bgrewrite⑤配置no-appendfsync-on-rewrite = yes,禁止在rewrite
传统缓存的问题传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,存在下面的问题:●请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈●Redis缓存失效时,会对数据库产生冲击多级缓存方案多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat压力,提升服务性能:JVM进程缓存本地进程缓存缓存在日常开发中启动至关重要的作用,由于是存储在
搭建分片集群主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:●海量数据存储问题●高并发写的问题使用分片集群可以解决.上述问题,分片集群特征:●集群中有多个master,每个master保存不同数据●每个master都可以有多个slave节点●master之间通过ping监测彼此健康状态●客户端请求可以访问集群任意节点,最终都会被转发到正确节点。散列插槽Redis会把每一-个m
●slave节点宕机恢复后可以找master节点同步数据,那master节点宕机怎么办?哨兵的作用Redis提供了哨兵(Sentinel) 机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:●监控: Sentinel会不断检查您的master和slave是否按预期工作自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master
搭建主从架构单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。假设有A、B两个Redis实例,如何让B作为A的slave节点?●在B节点执行命令: slaveof A的IP A的port主从数据同步原理全量同步主从第一次同步是全量同步:master如何判断slave是不是第一次来同步数据?这里会用到两个很重要的概念:Replication I
分布式缓存单点Redis的问题1.数据丢失问题Redis是内存存储,服务重启可能会丢失数据2.并发能力问题单节点Redis并发能力虽然不错,但也无法满足如618这样的高并发场景3.故障恢复问题如果Redis宕机,则服务不可用,需要一种自动的故障恢复手段4.存储能力问题Redis基于内存,单节点能存储的数据量难以满足海量数据需求Redis持久化●RDB持久化RDB全称Redis Database B
我们按月来统计用户签到信息,签到记录为1,未签到则记录为0.把每一个bit位对应当月的每一天, 形成了映射关系。用0和1标示业务状态,这种思路就称为位图(BitMap) 。Redis中是利用string类型数据结构实现BitMap,因此最大.上限是512M,转换为bit则是2^32个bit位。BitMap的操作命令有:SETBIT:向指定位置(offset) 存入一个0或1 GETBIT :获取指
HyperLogLog用法(实现UV统计)首先我们搞懂两个概念:●UV:全称Unique Visitor,也叫独立访客量,是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站,只记录1次。●PV:全称Page View,也叫页面访问量或点击量,用户每访问网站的一个页面,记录1次PV,用户多次打开页面,则记录多次PV。往往用来衡量网站的流量。UV统计在服务端做会比较麻烦,因为要判
附近店铺(Redis GEO数据结构实现)GEO数据结构GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。常见的命令有:GEOADD:添加一个地理空间信息,包含:经度(longitude) 、纬度(latitude) 、值( member)GEODIST:计算指定的两个点之间的距离并返回GEO
好友关注@Override public Result follow(Long followUserId, Boolean isFollow) { // 1.获取登录用户 Long userId = UserHolder.getUser().getId(); String key = "follows:" + userId;
点赞排行榜(ZSET实现)实现原理:使用redis的zset进行存储,score为当前时间,值为用户IDpublic Result likeBlog(Long id) { // 1.获取登录用户 Long userId = UserHolder.getUser().getId(); // 2.判断当前登录用户是否已经点赞 String key = BLOG_LIKED_KEY + id; Doub
消息队列(Message Queue) ,字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色:●消息队列:存储和管理消息,也被称为消息代理(Message Broker )●生产者:发送消息到消息队列●消费者:从消息队列获取消息并处理消息Redis提供了三种不同的方式来实现消息队列:◆list结构:基于List结构模拟消息队列◆PubSub:基本的点对点消息模型◆Stream: 比较完善
库存使用Redis的string类型进行存储下单人使用Redis的set类型进行存储,set类型中数据不可重复1.将优惠券数据存放到Redis中,通过Lua脚本实现对库存是否充足,用户是否下单,以及扣减库存的操作,Lua脚本时原子性的,要么成功,要么失败。2.开启异步线程,将数据存入数据库中,并发性能提高,秒杀耗时减少什么是阻塞队列在数据结构中,队列遵循FIFO(先进先出)原则。在java中,Qu
Redis联锁联锁(RedissonMultiLock)对象可以将多个RLock对象关联为一个联锁,实现加锁和解锁功能。每个RLock对象实例可以来自于不同的Redisson实例。如果负责储存分布式锁的某些Redis节点宕机以后,而且这些锁正好处于锁住状态,就会出现死锁问题。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗。看门狗的作用是在Redisson实例被关闭前,不断延长
基于setnx实现的分布式锁存在下面的问题:1.不可重入同一个线程无法多次获取同一把锁2.不可重试获取锁只尝试一次就返回false,没有重试机制3.超时释放锁超时释放虽然可以避免死锁,但如果是业务执行耗时较长,也会导致锁释放,存在安全隐患4.主从一致性(主写从读)如果Redis提供了主从集群,主从同步存在延迟,当主宕机时,如果从并同步主中的锁数据,则会出现锁实现RedissionRedisson是
分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。分布式锁的实现分布式锁的核心是实现多进程之间互斥基于Redis实现分布式锁Redis的Lua脚本Redis提供了Lua脚本功能,在一个脚本中编写多条Redis命令,确保多条命令执行时的原子性。Lua是一种编 程语言,它的基本语法大家可以参考网站: https://www.runoob.com/lua/lua-tutorial.htmlR
全局ID生成器当用户抢购时,就会生成订单并保存到订单这张表中,而订单表如果使用数据库自增ID就存在一些问题 :●id的规律性太明显,用户可以进行猜测●受单表数据量的限制全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般要满足下列特性:●唯一性●高可用●高性能●递增性●安全性public long nextId(String keyPrefix) { // 1.生成时间戳
什么是缓存缓存就是数据交换的缓冲区(称作Cache [kae[]),是存贮数据的临时地方,一般读写性能较高。缓存的作用●降低后端负载●提高读写效率,降低响应时间缓存的成本●数据一致性成本数据库与缓存需要保持一致●代码维护成本查询数据,修改数据需要更新缓存,增加代码量●运维成本一般的缓存都是集群的形式添加缓存缓存更新策略业务场景:●低一致性需求:使用内存淘汰机制。例如店铺类型的查询缓存●高一致性需求
Redis代替session需要考虑的问题◆选择合适的数据结构◆选择合适的key◆选择合适的存储粒度
Redis实现登录(基于session)拦截器:实现多模块用户登录的校验代码:创建拦截器public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse res
Jedis以Redis命令作为方法名称,学习成本低,简单实用。但是Jedi s实例是线程不安全的,多线程环境下需要基于连接池来使用lettuce(Spring默认使用)Lettuce是基于Netty实现的,支持同步、异步和响应式编程方式,并且是线程安全的。支持Redis的哨兵模式、集群模式和管道模式。RedissionRedisson是一个基于Redi s实现的分布式、可伸缩的Java数据结构集合
数据类型命令行操作Redis 获取命令说明命令行连接Redisredis -cli -h 127.0.0.1 -p 6379 如果有密码 AUTH 密码Redis通用命令Redis通用命令String类型常见命令key的结构String类型的三种格式hash类型常见命令list类型定义:Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号