redis 笔记02 对象、数据库

对象

Redis并没有使用之前介绍的数据结构来实现键值对数据库,而是基于那些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型对象,

每种对象都用到了至少一种我们前面所介绍的数据结构。

1. Redis数据库中的每个键值对的键和值都是一个对象。

2. Redis共有字符串、列表、哈希、集合、有序集合五种类型的对象,每种类型的对象至少都有两种或者以上的编码方式,不同的编码可以在不同的使用场景上优化对象的使用效率。

3. 服务器在执行某些命令之前,会先检查给定键的类型能否执行指定的命令,而检查一个键的类型就是检查键的值对象的类型。

4. Redis的对象系统带有引用计数实现的内存回收机制,当一个对象不再被使用时,该对象所占用的内存就会被自动释放。

5. Redis会共享值为0到9999的字符串对象。Redis只对包含整数值的字符串对象进行共享。

6. 对象会记录自己的最后一个被访问的时间,这个时间可以用于计算对象的空转时间,用以判断回收内存。

 

1. 每次当我们在Redis的数据库中新创建一个键值对时,我们至少会创建两个对象,一个对象用作键值对的键(键)对象,另一个对象用作键值对的值(值对象)

2. Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据相关的三个属性分别是type属性,encoding属性和ptr(pointer ,指针)属性。

3. 对于Redis数据库保存的键值对来说,键总是一个字符串对象,而值则可以是字符串对象、列表对象、哈希对象、集合对象或者有序集合对象的其中一种。

4. type key 命令返回该键对应的值对象的类型,而不是键对象的类型。type的返回值:string,list,hash,set,zset

5. 对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定。encoding属性记录了对象所使用的编码,也即是说这个对象使用什么数据结构

    (字典,链表等)作为对象的底层实现。

6. 每种类型的对象都至少使用了两种不同的编码。Redis可以根据不同的使用场景来为一个对象设置不同的编码,从而优化对象在某一场景下的效率。

7. 使用OBJECT ENCODING命令可以查看一个数据库的值对象的编码。

8. 字符串的编码可以是int,raw 或者 embstr(短字符串)。在条件满足的情况下,int和embstr会被转换成raw编码的字符串对象。(String ? )

9. 字符串常用命令:

    SET , GET , APPEDN , INCRBYFLOAT(浮点数加法),INCRBY(整数加法),DECRBY(整数减法),STRLEN(返回字符串的长度),SETRANGE(设置特定索引的值),GETRANGE(获取特定索引的值)

10. 列表对象的编码可以是ziplist(压缩列表)或者linkedlist(双端列表)。 (List ? )

11. 列表常用命令:

      LPUSH(新元素添加到表头),RPUSH(新元素添加到表尾),LPOP(获取并删除表头节点),RPOP(获取并删除表尾节点),LINDEX(获取指定索引的元素),LLEN(获取列表长度),

      LINSERT(在列表指定位置插入元素),LREM(删除不在指定索引范围内的节点),LSET(更新指定位置上的节点)

12. 哈希对象的编码可以是ziplist(压缩列表)或者hashtable(字典) . (Map ? )

13. 哈希对象常用命令:

      HSET(添加新节点),HGET(获取对应的值),HEXISTS(判断指定的键是否存在),HDEL(删除指定的节点),HLEN(返回键值对数量),HGETALL(返回所有键值对)

14. 集合对象的编码可以是intset(整数集合)或者hashtable(字典) (Set ?)

15. 集合对象常用命令:

      SADD,SCARD(获取元素数量),SISMEMBER(判断元素是否存在),SMEMBERS(返回所有键值),SRANDMEMBER(随即返回一个元素),SPOP(随即获取并删除元素),SREM(删除所有给定元素)

16. 有序集合对象,编码可以是ziplist(压缩列表)或者skiplist(字典+跳跃表,使用两种结构更高效)  (SortedSet ? )

17. 有序集合对象常用命令:

      ZADD,ZCAR(获取集合元素数量),ZCOUNT(获取给定范围内节点数量),ZRANG(从表头到表尾,返回给定索引范围内的所有元素),ZREVRANGE(从表尾到表头,返回给定索引范围内的所有元素),

      ZRANK(从表头向表尾,返回节点排名),ZREVRANK(从表尾到表头,返回节点排名),ZREM(删除),ZSCORE(获取分值)

18. Redis中用于操作键的命令基本上可以分为两种类型:

      1). 可以对任何类型的键执行,比如:DEL命令,EXPIRE命令、RENAME命令、TYPE命令 、OBJECT命令等。

      2). 只能对特定类型的键执行:

           SET,GET,APPEND,STRLEN等命令只能对字符串键执行;

           HDEL,HSET,HGET,HLEN等命令只能对哈希键执行;

           RPUSH,LPOP,LINSERT,LLEN等命令只能对列表键执行;

           SADD,SPOP,SINTER,SCARD等命令只能对集合键执行;

           ZADD,ZCARD,ZRANK,ZSCORE等命令只能对有序集合键执行。

19. Redis 除了会根据值对象的类型来判断键是否能够执行指定的命令之外,还会根据值对象的编码方式,选择正确的命令实现代码来执行命令,决定调用哪种结构的函数来执行。

20. 内存回收:当对象的引用计数值变为0时,对象所占用的内存会被释放。

 

数据库

1. Redis服务器的所有数据库都保存在redisServer.db数组中,而数据库的数量则由redisServer.dbnum属性保存。Redis服务器默认会创建16个数据库。

2. 客户端通过修改目标数据库指针,让它指向redisServer.db数组中的不同元素来切换不同的数据库。从而实现切换数据库的功能--这就是SELECT命令实现原理。

3. 数据库主要有dict和expires两个字典构成,其中dict字典负责保存键值对,成为键空间(key space);而expires字典则负责保存键的过期时间。

4. 因为数据库由字典构成,所以对数据库的操作都是建立在字典操作之上

5. 数据库的键总是一个字符串的对象,而值则可以是任意一种Redis对象类型,包括字符串对象、哈希表对象、集合对象、列表对象和有序集合对象,分别对应字符串键、哈希表键、集合键、列表键和有序集合键。

6. expires字典的键指向数据库中的某个键,而值则记录了数据库键的过期时间,过期时间是一个以毫秒为单位的UNIX时间戳。

7. Redis使用惰性删除和定期删除两种策略来删除过期的键:惰性删除策略只有在碰到过期键时才进行删除操作,定期删除策略则每隔一段时间主动查找并删除过期键。

8. 执行SAVE命令或者BGSAVE命令所产生的新RDB文件不会包含已过期的键。

9. 执行BGREWRITEAOF命令所产生的重写AOF文件不会包含已过期的键

10. 当一个过期键被删除之后,服务器会追加一条DEL命令到现有的AOF文件末尾,显示地删除过期键。

11. 当主服务器删除一个过期键之后,服务器会追加一条DLE命令到现有的AOF文件的末尾,显示地删除过期键。

12. 从服务器即使发现过期键也不会自作主张的删除它,而是等待主节点发来DLE命令,这种统一、中心化的过期键删除策略可以保证主从服务器数据的一致性。

13. 当Redis命令对数据库进行修改之后,服务器会根据配置向客户端发送数据库通知。

14. 默认情况下,Redis客户端的目标数据库为0号数据库,但客户端可以通过执行SELECT命令来切换目标数据库。

15. 添加新建、删除键、更新键、对键取值等操作都是通过对键空间进行操作来进行实现的。

16. 读写键空间时的维护操作:包括更新键空间命中次数和不命中次数,更新LRU(最后一次使用时间),判断键是否过期等。

17. 设置生存时间或者过期时间:

      1). EXPIRE <key> <ttl> 命令用于将键key的生存时间设置为ttl秒。

      2). PEXPIRE <key> <ttl> 命令用于将键key的生存时间设置为ttl毫秒。

      3). EXPIREAT <key> <timestamp> 命令用于将键key的过期时间设置为timestamp所指定秒数时间戳。

      4). PEXPIREAT <key> <timestamp> 命令用于将键key的过期时间设置为timestamp所指定毫秒数时间戳。

       实际上这些命令都是使用PEXPIREAT命令来实现的。

18. PERSIST命令可以移除一个键的过期时间

19. TTL命令以秒为单位返回键的剩余生存时间,而PPTL命令则以毫秒为单位返回键的剩余生存时间。

20. 过期删除策略:

      1). 定时删除:使用定时器,定时删除。优点:保证尽快删除,释放内存        缺点:对CPU时间不友好

      2). 惰性删除:程序取出键时对键进行检查,删除过期键值。  优点:对CPU时间友好,不会再无用的过期键上浪费CPU。      缺点:对内存不友好。

      3). 定期删除:每隔一段时间执行一次删除过期操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。 难点在于确定删除操作执行的时长和频率。

21. 到目前为止,Redis仍然没有可以返回客户端目标数据库的命令。为避免对数据库进行误操作,在执行Redis命令,特别是想FLUSHDB这样的危险命令之前,最好先执行一个SELECT命令,

      显示地切换到指定的数据库,然后再执行别的命令。

 

posted @ 2016-01-05 23:21  Jtianlin  阅读(491)  评论(0编辑  收藏  举报