解决了redis的这些问题,你就是redis高手( 二 )


所以 Redis 具有快速和数据持久化的特征 。如果不将数据放在内存中,磁盘 I/O 速度为严重
影响 Redis 的性能 。在内存越来越便宜的今天,Redis 将会越来越受欢迎 。
Redis支持的数据类型?String字符串:
格式: set key value
string类型是二进制安全的 。意思是redis的string可以包含任何数据 。比如jpg图片或者序列化的对象。
string类型是Redis最基本的数据类型,一个键最大能存储512MB 。
Hash(哈希)
格式: hmset name key1 value1 key2 value2
Redis hash 是一个键值(key=>value)对集合 。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象 。
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序 。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
格式: lpush name value
在 key 对应 list 的头部添加字符串元素
格式: rpush name value
在 key 对应 list 的尾部添加字符串元素
格式: lrem name index
key 对应 list 中删除 count 个和 value 相同的元素
格式: llen name
返回 key 对应 list 的长度
Set(集合)
格式: sadd name value
Redis的Set是string类型的无序集合 。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1) 。
zset(sorted set:有序集合)
格式: zadd name score value
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员 。
不同的是每个元素都会关联一个double类型的分数 。redis正是通过分数来为集合中的成员进行从小到大的排序 。
zset的成员是唯一的,但分数(score)却可以重复 。
sds相对c的改进?获取长度:c字符串并不记录自身长度,所以获取长度只能遍历一遍字符串,redis直接读取len即可 。
缓冲区安全:c字符串容易造成缓冲区溢出,比如:程序员没有分配足够的空间就执行拼接操作 。而redis会先检查sds的空间是否满足所需要求,如果不满足会自动扩充 。
内存分配:由于c不记录字符串长度,对于包含了n个字符的字符串,底层总是一个长度n+1的数组,每一次长度变化,总是要对这个数组进行一次内存重新分配的操作 。因为内存分配涉及复杂算法并且可能需要执行系统调用,所以它通常是比较耗时的操作 。
redis链表源码?有什么特性?双端、无环、带长度记录、
多态:使用 void* 指针来保存节点值,可以通过 dup 、 free 、 match 为节点值设置类型特定函数,可以保存不同类型的值 。
字典是如何实现的?其实字典这种数据结构也内置在很多高级语言中,但是C语言没有,所以redis自己实现了 。
应用也比较广泛,比如redis的数据库就是字典实现的 。不仅如此,当一个哈希键包含的键值对比较多,或者都是很长的字符串,redis就会用字典作为哈希键的底层实现 。
LRU?redis里的具体实现?LRU全称是Least Recently Used,即最近最久未使用的意思 。
LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小 。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰 。
redis原始的淘汰算法简单实现:当需要淘汰一个key时,随机选择3个key,淘汰其中间隔时间最长的key 。**基本上,我们随机选择key,淘汰key效果很好 。后来随机3个key改成一个配置项"N随机key" 。但把默认值提高改成5个后效果大大提高 。考虑到它的效果,你根本不用修改他 。
redis的持久化?

  1. RDB持久化可以手动执行,也可以配置定期执行,可以把某个时间的数据状态保存到RDB文件中,反之,我们可以用RDB文件还原数据库状态 。
  2. AOF持久化是通过保存服务器执行的命令来记录状态的 。还原的时候再执行一遍即可 。
如何选择合适的持久化方式?一般来说,如果想达到足以媲美 PostgreSQL 的数据安全性,你应该同时使用两种持久
化功能 。如果你非常关心你的数据,但仍然可以承受数分钟以内的数据丢失,那么你可以
只使用 RDB 持久化 。
有很多用户都只使用 AOF 持久化,但并不推荐这种方式: 因为定时生成 RDB 快照
(snapshot) 非常便于进行数据库备份,并且 RDB 恢复数据集的速度也要比 AOF 恢复
的速度要快,除此之外,使用 RDB 还可以避免之前提到的 AOF 程序的 bug 。
Redis 集群方案应该怎么做? 都有哪些方案?1.twemproxy,大概概念是,它类似于一个代理方式,使用方法和普通 Redis 无任何区别,


推荐阅读