对象

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命令,

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

redis 笔记02 对象、数据库的更多相关文章

  1. Redis笔记(3)多数据库实现

    1.前言 本章介绍redis的三种多服务实现方式,尽可能简单明了总结一下. 2.复制 复制也可以称为主从模式.假设有两个redis服务,一个在127.0.0.1:6379,一个在127.0.0.1:1 ...

  2. Redis笔记(2)单机数据库实现

    1.前言 上节总结了一下redis的数据结构和对象构成,本章介绍redis数据库一个基本面貌,是如何设计的. 2.数据库 服务器结构redisServer: redisDb *db: 一个数组,保存服 ...

  3. Redis:学习笔记-02

    Redis:学习笔记-02 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 4. 事物 Redis 事务本 ...

  4. Redis 笔记 01:入门篇

    Redis 笔记 01:入门篇 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...

  5. redis笔记总结之redis介绍

    一.Redis介绍: redis的发展历史简单的理解为因为使用类似MySql这类关系型数据库不方便进而开发的开源的.轻量级的.非关系型的,直到现在一直不断完善的一款NoSql数据库.具体的介绍大家可以 ...

  6. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  7. Redis如何存储对象与集合示例详解

      前言 大家都知道在项目中,缓存以及mq消息队列可以说是不可或缺的2个重要技术.前者主要是为了减轻数据库压力,大幅度提升性能.后者主要是为了提高用户的体验度,我理解的是再后端做的一个ajax请求(异 ...

  8. ASP.NET Identity 2集成到MVC5项目--笔记02

    ASP.NET Identity 2集成到MVC5项目--笔记01 ASP.NET Identity 2集成到MVC5项目--笔记02 继上一篇,本篇主要是实现邮件.用户名登陆和登陆前邮件认证. 1. ...

  9. (一)Redis笔记——简介 、key 、数据类型

    1.  Redis是什么.特点.优势 Redis是一个开源的使用C语言编写.开源.支持网络.可基于内存亦可持久化的日志型.高性能的Key-Value数据库,并提供多种语言的API. 它通常被称为数据结 ...

随机推荐

  1. 01 Java图形化界面设计——容器(JFrame)

    程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构,现在就进入java图形化界面编程. 一.Jav ...

  2. 百度富文本编辑器UEditor报【类型"Uploader"同时存在】错误

    错误信息: 类型“Uploader”同时存在.... 解决方案: 方法一:将UEditor的net文件夹下的Uploader.cs文件的生成操作属性默认是“编译”,只需要将这个文件的生成操作属性改为“ ...

  3. 【PyQt】分析承载界面

    承载界面: # coding=utf-8 import sys from PyQt4.QtCore import * from PyQt4.QtGui import * import class_da ...

  4. 努比亚Z18mini多点对焦

    25点对焦 分为了中心对焦.中间对焦.边缘对焦三个区域 [参考文献] 手机上感受单反的“多点对焦”努比亚Z18mini给你想象 https://baijiahao.baidu.com/s?id=160 ...

  5. iOS开源库–最全的整理

    本文转载至 http://www.code4blog.com/archives/505 youtube下载神器:https://github.com/rg3/youtube-dl我擦咧vim插件:ht ...

  6. 【MVC model 验证失效 】【Unexpected token u in JSON at position 0】【jquery-plugin-validation】

    问题描述:mvc model 调用jquery-plugin-validation 实现 前台的数据验证,时报错 Unexpected token u in JSON at position 0 很讨 ...

  7. Leetcode-Permuation Sequence

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  8. Oracle 数据库的组成(instance+database)

    Oracle服务器是一种对象关系数据库管理系统,它为信息管理提供开放.综合.集成的方法. Oracle服务器中有多种进进程.内存结构和文件: Oracle服务器由一个Oracle实例和一个Oracle ...

  9. CMDB初步了解

    本节内容 浅谈ITIL CMDB介绍 Django自定义用户认证 Restful 规范 资产管理功能开发 浅谈ITIL TIL即IT基础架构库(Information Technology Infra ...

  10. Python每日一练------内置函数+内置变量+内置模块

    1.内置函数 Python所有的内置函数     Built-in Functions     abs() divmod() input() open() staticmethod() all() e ...