JAVA互联搬砖工人▲快看看这40道面试题,面试还搞不懂Redis( 四 )


2、事务是一个原子操作:事务中的命令要么全部被执行 , 要么全部都不执行 。
Redis事务相关的命令有哪几个?
答:MULTI、EXEC、DISCARD、WATCH
Rediskey的过期时间和永久有效分别怎么设置?
答:EXPIRE和PERSIST命令 。
Redis如何做内存优化?
答:尽可能使用散列表(hashes) , 散列表(是说散列表里面存储的数少)使用的内存非常小 , 所以你应该尽可能的将你的数据模型抽象到一个散列表里面 。 比如你的web系统中有一个用户对象 , 不要为这个用户的名称 , 姓氏 , 邮箱 , 密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面 。
Redis回收进程如何工作的?
答:一个客户端运行了新的命令 , 添加了新的数据 。 Redi检查内存使用情况 , 如果大于maxmemory的限制,则根据设定好的策略进行回收 。 一个新的命令被执行 , 等等 。
所以我们不断地穿越内存限制的边界 , 通过不断达到边界然后不断地回收回到边界以下 。 如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键) , 不用多久内存限制就会被这个内存使用量超越 。
都有哪些办法可以降低Redis的内存使用情况呢?
答:如果你使用的是32位的Redis实例 , 可以好好利用Hash,list,sortedset,set等集合类型数据 , 因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起 。
JAVA互联搬砖工人▲快看看这40道面试题,面试还搞不懂Redis
文章图片
Redis的内存用完了会发生什么?
答:如果达到设置的上限 , Redis的写命令会返回错误信息(但是读命令还可以正常返回 。 )或者你可以将Redis当缓存来使用配置淘汰机制 , 当Redis达到内存上限时会冲刷掉旧的内容 。
一个Redis实例最多能存放多少的keys?List、Set、SortedSet他们最多能存放多少元素?
答:理论上Redis可以处理多达232的keys , 并且在实际中进行了测试 , 每个实例至少存放了2亿5千万的keys 。 我们正在测试一些较大的值 。 任何list、set、和sortedset都可以放232个元素 。 换句话说 , Redis的存储极限是系统中的可用内存值 。
MySQL里有2000w数据 , redis中只存20w的数据 , 如何保证redis中的数据都是热点数据?
答:Redis内存数据集大小上升到一定大小的时候 , 就会施行数据淘汰策略 。
相关知识:Redis提供6种数据淘汰策略:
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
Redis最适合的场景?
1、会话缓存(SessionCache)
最常用的一种使用Redis的情景是会话缓存(sessioncache) 。 用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化 。 当维护一个不是严格要求一致性的缓存时 , 如果用户的购物车信息全部丢失 , 大部分人都会不高兴的 , 现在 , 他们还会这样吗?幸运的是 , 随着Redis这些年的改进 , 很容易找到怎么恰当的使用Redis来缓存会话的文档 。 甚至广为人知的商业平台Magento也提供Redis的插件 。
2、全页缓存(FPC)
除基本的会话token之外 , Redis还提供很简便的FPC平台 。 回到一致性问题 , 即使重启了Redis实例 , 因为有磁盘的持久化 , 用户也不会看到页面加载速度的下降 , 这是一个极大改进 , 类似PHP本地FPC 。 再次以Magento为例 , Magento提供一个插件来使用Redis作为全页缓存后端 。 此外 , 对WordPress的用户来说 , Pantheon有一个非常好的插件wp-redis , 这个插件能帮助你以最快速度加载你曾浏览过的页面 。


推荐阅读