Redis面试题目redis备份与恢复 redis所有数据都是保存到内存中的 redis有两种持久化机制:RDB,快照形式,它会定期把内存中当前时刻的数据保存到磁盘,是Redis默认支持的持久化方案;AOF(appendonly file):它是把所有对redis数据库操作的命令,比如说增删改操作的命令,保存到文件中,数据库恢复时把所有的命令执行一遍即可;我们一般会同时开启这两个配置 如何配置: RDB默认不要配置,AOF修改redis.conf配置:将appendonly 改为yes Rdb持久化通过快照完成,快照执行时机时可以配置的,默认预置了3个条件,比如说900秒内至少1个键被更改时就会进行快照,将内存中的所有数据都存储在硬盘上,其在快照的过程中不会修改RDB文件,快照结束后才会将旧的文件替换成新的,所以任何时候RDB文件都是完整的,这就使得我们可以通过定时备份RDB文件来实现redis数据库的备份 Redis启动时会读取RDB快照文件将数据从硬盘载入到内存,通过RDB方式实现持久化,一旦redis异常退出,就会丢失最后一次快照以后更改的所有数据,所以我们一般会组合RDB和AOF的方式,来减少数据的丢失,默认情况下redis没有开启AOF方式的持久化,配置开启后,每执行一条会更改redis中的数据的命令,redis就会将该命令写入硬盘的AOF文件中,启动redis时redis会逐个执行 AOF文件中的命令来将硬盘中的数据载入到内存中去(可配置AOF重写条件以及硬盘刷新缓存机制) 优点:读写分离,通过复制可以实现读写分离以提高服务器的负载能力,可以通过复制功能建立多个从数据库,主数据库只进行写操作,而从数据库负责读操作。 从数据库持久化:持久化通常相对比较耗时,为了提高性能,可以通过复制功能建立一个(或若干个)从数据库,并在从数据库中启用持久化,同时在主数据库禁用持久化。当从数据库崩溃时重启后主数据库会自动将数据同步过来,所以无需担心数据丢失 两种方案同时开启使用AOF恢复数据库,因为其shuju 完整性更高,持久化频率为每秒 Redis持久化配置方便,集群 redis集群怎么连接通过client连接时,在命令最后添加-c指令:# redis01/redis-cli -p 7002 -c -c:代表连接的是redis集群 有没有对jedis进行封装封装了,将常用的操作redis的方法提取出一个接口,分别对应单机版和集群版创建两个实现类 Redis5种数据类型,常用命令数据类型:String,hash,list,set,sortedset 常用命令:get,set,incr,decr,exists,lpush,lpop,rpush,rpop 判断用户是否登录的逻辑业务层根据token(模拟session的id)查询redis,如果查询不到用户信息,返回用户已经过期,查询到数据,说明用户已经登录,重置过期时间 本网站外部的子网站怎么实现单点登录对外提供单点登陆的接口,实现验证 共享cookie,cookie是不能跨域访问的,但是在二级域名是可以共享cookie的,所以我们设计将多个系统的一级域名统一的,二级域名不同来区别每个系统,然后token写入cookie时,设置cookie的domain和path属性,这样访问其他子网站时会携带cookie,然后就可以访问cookie中的token,根据token去查询redis中缓存的数据 你前台portal采用4台服务器集群部署,那能前台高并发访问性能提上去了,那数据库会不会造成一个瓶颈,这一块你是怎么处理的portal系统在高并发的情况下如果每次请求都请求查询数据库确实会出现数据库的瓶颈。为了降低数据库压力,在服务层会添加一个缓存,用redis实现,这样的话请求先到缓存中查找是否有缓存的内容,如果有直接从缓存中取数据,如果没有再到数据库中查询。这样数据库的压力就不会那么大了 redis为什么可以做缓存?项目中使用redis的目的是什么?redis什么时候使用?1)Redis是key-value形式的nosql数据库,可以快速的定位到所查找的key,并把其中的value取出来,并且redis的所有的数据都是放到内存中,存取的速度非常快,一般都是用来做缓存使用。 2)项目中使用redis一般都是作为缓存来使用的,缓存的目的就是为了减轻数据库的压力提高存取的效率。 3)在互联网项目中只要是涉及高并发或者是存在大量读数据的情况下都可以使用redis作为缓存。当然除了缓存还可以根据实际的业务场景来决定redis的作用。例如使用redis保存用户的购物车信息、session信息 第一个是当两个客户同时买一件商品时库存只有一个了,怎么控制?可以使用mysql的行锁机制,实现乐观锁,在更新商品之前将商品锁定,其他用户无法读取,当此用户操作完毕后释放锁。当并发量高的情况下,需要使用缓存工具例如redis来管理库存 如果用户一直添加购物车添加商品怎么办?并且他添加一次你查询一次数据库?互联网上用户那么多,这样会对数据库造成很大压力你怎么办?当前我们使用cookie的方式来保存购物车的数据,所以当用户往购物车中添加商品时,并不对数据库进行操作。将来把购物车商品放入redis中,redis是可以持久化的可以永久保存,此时就算是频繁的往购物车中添加数据也没用什么问题 秒杀抢购库存解决方案1.Redis实现3个list:内存更不上 用户id存储在list中 库存存储在list中 命中的用户id存储在list中,然后通过mq,生成订单 Reids单线程,jedis是多线程,并发量大获取到的数据是一样的,所以并不能只用一个list处理 2.普通key-value,redis递减,redis事务multi,开启事务,命令,exec,没有回滚,redis watch 事务中监控变化,监控到变化会回滚 3.不用缓存,只用数据库,数据库表记录锁 Redis订阅发布,哨兵收集互相状态 热门商品:淘汰策略,保证数据是高频数据,lru算法,首先设定好热门商品的数量,设好redis的内存,32为默认最大32G,64没有限制,当redis,执行策略,访问量小的,过期时间长的,默认开启 事务单机版比较好保证,集群版事务可能有问题 数据库切换,select 0 参考redis官网 秒杀随机抢中用什么方案比如秒杀可抢中的人10人, 在redis中设计一个队列,存放100个最先点击购买按钮的用户,然后随机的pop出记录作为中奖的用户即可
|