html静态网站开发自我介绍,网站手机客户端开发教程,卫生院网站建设,重庆个人网络营销定制什么是Redis
Redis(Remote Dictionary Server)键只能为字符串#xff0c;值#xff1a;字符串、列表、集合、散列表、有序集合。Redis 用来做分布式锁。支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。
Redis为什么这么快
完全基于内存#xff0c;数据结构简单…
什么是Redis
Redis(Remote Dictionary Server)键只能为字符串值字符串、列表、集合、散列表、有序集合。Redis 用来做分布式锁。支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。
Redis为什么这么快
完全基于内存数据结构简单采用单线程
Redis有哪些数据类型
StringListSetZsetHash
Redis的应用场景
计数器
可以对 String 进行自增自减运算从而实现计数器功能 可用于分布式锁限流
缓存
将热点数据放到内存中设置内存的最大使用量以及淘汰策略来保证缓存的命中率。
会话缓存
可以使用 Redis 来统一存储多台应用服务器的会话信息。当应用服务器不再存储用户的会话信息也就不再具有状态一个用户可以请求任意一个应用服务 器从而更容易实现高可用性以及可伸缩性。
数据类型
string——适合最简单的k-v存储类似于memcached的存储结构短信验证码配置信息等就用这种类型来存储。 hash——一般key为ID或者唯一标示value对应的就是详情了。如商品详情个人信息详情新闻详情等。 list——因为list是有序的比较适合存储一些有序且数据相对固定的数据。如省市区表、字典表等。因为list是有序的适合根据写入的时间来排序如最新 的***消息队列等。 set——可以简单的理解为ID-List的模式如微博中一个人有哪些好友set最牛的地方在于可以对两个set提供交集、并集、差集操作。例如查找两个人 共同的好友等。 Sorted Set——是set的增强版本增加了一个score参数自动会根据score的值进行排序。比较适合类似于top 10等不根据插入的时间来排序的数据。
什么是Redis持久化
持久化就是把内存的数据写到磁盘中去防止服务宕机了内存数据丢失。
Redis 的持久化机制是什么各自的优缺点
RDB默认 和 AOF 机制
RDB
RDB
是Redis DataBase缩写快照是Redis默认的持久化方式按照一定的时间将内存的数据以快照的形式保 存到硬盘中对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。
优点
1、只有一个文件 dump.rdb方便持久化。 2、容灾性好一个文件可以保存到安全的磁盘。 3、性能最大化fork 子进程来完成写操作让主进程继续处理命令所以是IO 最大化。使用单独子进程来进行持久化主进程不会进行任何 IO 操作保证了redis 的高性能 4.相对于数据集大时比 AOF 的启动效率更高。
AOF持久化
Append Only File持久化每次写命令记录到日志文件中当重启Redis会重新将持久化的日志中文件恢复数据。当两种方式同时开启时优先选择AOF恢复。
优点
数据安全aof 持久化可以配置 appendfsync 属性有 always每进行一次 命令操作就记录到 aof 文件中一次
缺点
AOF 文件比 RDB 文件大且恢复速度慢。
如何选择合适的持久化方式
要数据安全性 选 AOF其他情况选RDBRDB方便备份恢复也快
Redis的过期键的删除策略
定时过期每个设置过期时间的key都需要创建一个定时器到过期时间就会立即清除。该策略可以立即清除过期的数据对内存很友好但是会占用大量的CPU资 源去处理过期的数据惰性过期只有当访问一个key时才会判断该key是否已过期过期则清除。节省CPU资源对内存不友好。占用大量内存。定期过期每隔一定的时间会扫描一定数量的数据库的expires字典中一定数量的key并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
(expires字典会保存所有设置了过期时间的key的过期时间数据其中key某个键的指针value是该键的过期时间。键空间是指该Redis集群中保存的所有键。) Redis中同时使用了惰性过期和定期过期两种过期策略。
key的过期时间和永久有效分别怎么设置
EXPIRE和PERSIST命令。
Redis的内存淘汰策略有哪些
缓存的内存不足时怎么处理需要新写入且需要申请额外空间的数据。 全局的键空间选择性移除
noeviction新写入操作会报错。allkeys-lru移除最近最少使用的key。这个是最常用的allkeys-random当随机移除某个key。
设置过期时间的键空间选择性移除
volatile-lru在设置了过期时间的键中移除最近最少使用的key。volatile-random在设置了过期时间的键中随机移除某个key。volatile-ttl在设置了过期时间的键中有更早过期时间的key优先移除。
Redis事务的概念
redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
一次执行完按照顺序执行其他命令插不进来
Redis事务的三个阶段
事务开始 MULTI命令入队事务执行 EXEC
收到有EXEC、DISCARD、WATCH、MULTI之外的请求将会把请求放入队列中排队
Redis事务相关命令
redis 不支持回滚“Redis 在事务失败时不进行回滚而是继续执行余下的命令” 所以 Redis快。一个事务中的命令出现错误那么所有的命令都不会执行一个事务中出现运行错误那么正确的命令会被执行。
WATCH 命令是一个乐观锁可以为 Redis 事务提供 check-and-set CAS行为。 可以监控多个键一旦其中有一个键被修改或删除之后的事务就不会执行监控一直持续到EXEC命令。MULTI命令开启一个事务它总是返回OK。 MULTI执行之后客户端向服务器发送命令命令不会立即被执行而是被放到一个队列中当EXEC命令被调用时队列中的命令才会被执行。EXEC执行所有事务块内的命令。返回事务块内所有命令的返回值按命令执行的先后顺序排列。 当操作被打断时返回空值 nil 。DISCARD客户端可以清空事务队列并放弃执行事务 并且客户端会从事务退出。UNWATCH 命令可以取消watch对key的监控。
事务管理ACID概述
原子性Atomicity 原子性是指事务是一个不可分割的工作单位事务中的操作要么都发生要么都不发生。一致性Consistency 事务前后数据的完整性必须保持一致。隔离性Isolation 多个事务并发执行时一个事务的执行不应影响其他事务的执行持久性Durability 持久性是指一个事务一旦被提交它对数据库中数据的改变就是永久性的接下来即使数据库发生故障也不应该对其有任何影响。提交到磁盘。
Redis的事务总是具有ACID中的一致性和隔离性其他特性是不支持的。当服务器运行在AOF持久化模式下并且appendfsync选项的值为always时事务也具有耐久性。
Redis事务支持隔离性吗
Redis 是单进程程序在执行事务时不会对事务进行中断事务可以运行直到执行完所有事务队列中的命令为止。因此Redis 的事务是总是带有隔离性的。
Redis事务保证原子性吗支持回滚吗
Redis中单条命令是原子性执行的但事务不保证原子性且没有回滚。事务中任意命令执行失败其余的命令仍会被执行。
Redis事务其他实现
基于Lua脚本Redis可以保证脚本内的命令一次性、按顺序地执行其同时也不提供事务运行错误的回滚执行过程中如果部分命令运行错误剩下的命令还是会继续运行完
项目运用 利用Lua脚本判断用户是否已达最大参与次数 //4.扣减活动可参与总次数-剩余次数String script local signUpTimes redis.call(get, KEYS[1]) local decr tonumber(ARGV[1]) if signUpTimes and tonumber(signUpTimes) decr then return redis.call(decrby, KEYS[1], decr) else return -1 end ;RedisScriptLong redisScript new DefaultRedisScript(script, Long.class);Long result stringTemplate.execute(redisScript, Collections.singletonList(signUpNumKey), String.valueOf(1));if (RedisConstant.LUA_SCRIPT_FAIL.equals(result)) {log.info(该用户已达最大参与次数);throw new DefinitelyRuntimeException(报名人数已满);}Redis实现分布式锁
当且仅当 key 不存在将 key 的值设为 value。 若给定的 key 已经存在则SETNX 不做任何动作 SETNX 是『SET if Not eXists』(如果不存在则 SET)的简写。 返回值设置成功返回 1 。设置失败返回 0 。 使用SETNX完成同步锁的流程
使用SETNX命令获取锁若返回0则获取失败反之获取成功为了防止获取锁后程序出现异常导致其他线程调用SETNX命令总是返回0而进入死锁状态需要为该key设置一个“合理”的过期时间释放锁
自定义分布式锁注解
redis实现限流
Redis四种缓存方式
单机主从哨兵集群
缓存击穿
定义
指缓存中没有但数据库中有的数据一般是缓存时间到期这时由于并发用户特别多同时读缓存没读到数据又同时去数据库去取数据引起数据库压力瞬间增大造成过大压力。和缓存雪崩不同的是缓存击穿指并发查同 一条数据缓存雪崩是很多数据都查不到从而查数据库。
总结
缓存击穿一条数据查不到缓存雪崩多条数据查不到
解决方案
设置热点数据永远不过期。加互斥锁这个没懂给谁加互斥锁
缓存预热
缓存预热就是系统上线后将相关的缓存数据直接加载到缓存系统。用户直接查询事先被预热的缓存数据
解决方案
直接写个缓存刷新页面上线时手工操作一下数据量不大可以在项目启动的时候自动进行加载定时刷新缓存
缓存降级
当访问量剧增、服务出现问题如响应时间慢或不响应或非核心服务影响到核心流程的性能时仍然需要保证服务还是可用的即使是有损服务。系统可以根据一些关键数据进行自动降级也可以配置开关实现人工降级。
目的是保证核心服务可用即使是有损的。而且有些服务是无法 降级的如加入购物车、结算。
哪些可降级比如可以参考日志级别设置预案
服务正在上线而超时些服务在一段时间内成功率有波动可用率低于90%或者数据库连接池被打爆了
热点数据和冷数据
热点数据缓存才有价值 对于冷数据而言大部分数据可能还没有再次访问到就已经被挤出内存不仅占 用内存而且价值不大。频繁修改的数据看情况考虑使用缓存 对于热点数据比如我们的某IM产品生日祝福模块当天的寿星列表缓存 以后可能读取数十万次。再举个例子某导航产品我们将导航信息缓存以后 可能读取数百万次。 数据更新前至少读取两次缓存才有意义。这个是最基本的策略如果缓存还没有起作用就失效了那就没有太大价值了。 那存不存在修改频率很高但是又不得不考虑缓存的场景呢有比如这个读取接口对数据库的压力很大但是又是热点数据这个时候就需要考虑通过缓存手段减少数据库的压力比如我们的某助手产品的点赞数收藏数分享数等是非常典型的热点数据但是又不断变化此时就需要将数据同步保存到 Redis缓存减少数据库压力。
缓存热点key
缓存中的一个Key(比如一个促销商品)在某个时间点过期的时候恰好在这个时间点对这个Key有大量的并发请求过来这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存这个时候大并发的请求可能会瞬间把后端DB压 垮。 解决方案 对缓存查询加锁如果KEY不存在就加锁然后查DB入缓存这样缓存就有数据了然后解锁其他进程如果发现有锁就等待然后等解锁后此时缓存就有数据了不需要再查数据库
Redis Mysql如何保证一致性
延迟双删先删除缓存然后去更新数据库更新完再删一遍缓存【第二次删是防止A线程去更新数据库时B线程又把数据库的旧数据存到redsis上了】MySQL binlog 消息推送更新
Redis Mysql如何保证一致性
使用Redis做过消息队列吗是如何实现的
使用list类型保存数据信息rpush生产消息lpop消费消息当lpop没有消息时可以sleep一段时间然后再检查有没有信息如果不想sleep的话可以使用blpop, 在没有信息的时候会一直阻塞直到信息的到来。redis可以通过pub/sub主题订阅模式实现一个生产者多个消费者当然也存在一定的 缺点当消费者下线时生产的消息会丢失
一个字符串类型的值能存储最大容量是多少
512M
redis场景应用