文章目录
- Redis问题
-
- 1. Redis有哪几种数据淘汰策略?
- 2. redis事务
- 3. 一个字符串类型的值能存储最大容量是多少?
- 4. Redis回收进程如何工作?
- 5. Redis如何做内存优化?
- 6. Redis如何做大量数据插入?
- 7. 为什么要做Redis分区?
- 8. 你知道有哪些Redis分区实现方案?
- 9. redis分区有什么缺点?
- 10.Redis持久化数据和缓存怎么做扩容?
- 11. 分布式Redis是前期做还是后期规模上来了再做好?为什么?
- 12 Twemproxy是什么?
- 13. Redis与其他key-value存储有什么不同?
- 14. Redis的内存占用情况怎么样?
- 15. 都有哪些办法可以降低Redis的内存使用情况呢?
- 16. 查看Redis使用情况及状态信息用什么命令
- 17. redis常见性能问题和解决方案?
- 18. 修改配置不重启Redis会实时生效吗?
Redis问题
1. Redis有哪几种数据淘汰策略?
noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在设定了有效期集合的键,使得新添加的数据有空间存放。
allkeys-random: 回收随机的键使得新添加的数据有空间存放。
volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在设定了有效期集合的键。
volatile-ttl: 回收在设定了有效期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
2. redis事务
redis事务并不能保证原子性:
如果你具备关系型数据库的知识背景,你就会发现一个事实:在事务运行期间,虽然Redis命令可能会执行失败,但是Redis仍然会执行事务中余下的其他命令,而不会执行回滚操作,你可能会觉得这种行为很奇怪。
然而,这种行为也有其合理之处:
只有当被调用的Redis命令有语法错误时,这条命令才会执行失败(在将这个命令放入事务队列期间,Redis能够发现此类问题),或者对某个键执行不符合其数据类型的操作:实际上,这就意味着只有程序错误才会导致Redis命令执行失败,这种错误很有可能在程序开发期间发现,一般很少在生产环境发现。
Redis已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为Redis不需要事务回滚的能力。
对于Redis事务的这种行为,有一个普遍的反对观点,那就是程序有可能会有缺陷(bug)。但是,你应当注意到:事务回滚并不能解决任何程序错误。例如,如果某个查询会将一个键的值递增2,而不是1,或者递增错误的键,那么事务回滚机制是没有办法解决这些程序问题的。请注意,没有人能解决程序员自己的错误,这种错误可能会导致Redis命令执行失败。正因为这些程序错误不大可能会进入生产环境,所以我们在开发Redis时选用更加简单和快速的方法,没有实现错误回滚的功能。
常用指令:
1. MULTI
用于标记事务块的开始。Redis会将后续的命令逐个放入队列中,然后才能使用EXEC命令原子化地执行这个命令序列。
这个命令的运行格式如下所示:
MULTI
这个命令的返回值是一个简单的字符串,总是OK。
2. EXEC
在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态。
当使用WATCH命令时,只有当受监控的键没有被修改时,EXEC命令才会执行事务中的命令,这种方式利用了检查再设置(CAS)的机制。
这个命令的运行格式如下所示:
EXEC
这个命令的返回值是一个数组,其中的每个元素分别是原子化事务中的每个命令的返回值。 当使用WATCH命令时,如果事务执行中止,那么EXEC命令就会返回一个Null值。
3. DISCARD
清除所有先前在一个事务中放入队