对象

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. python笔记9 : 多线程

    基础: 什么是进程(process)? 每一个程序的内存是独立的,例如:world不能访问QQ. 进程:QQ是以一个整体的形式暴露给操作系统管理,里面包含了各种资源的调用(内存管理.网络接口调用等). ...

  2. 解决java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver问题

    今天在做项目的时候突然遇到解决java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver问题,知道是j ...

  3. [MachineLearning]KNN

    # -*- coding: utf-8 -*- """ Created on Wed Jun 18 11:46:15 2014 @author: hp "&qu ...

  4. ASP.NET动态添加控件一例

    第一次单击页面中有3个Label,第二次单击有6个,第三次单击有9个,也就是每次单击要在上次的状态下再添加3个. 我的方法是,可以通过Session来保存上次的状态,一种解法如下: Test.aspx ...

  5. boost-tokenizer分词库学习

    boost-tokenizer学习 tokenizer库是一个专门用于分词(token)的字符串处理库;可以使用简单易用的方法把一个字符串分解成若干个单词;tokenizerl类是该库的核心,它以容器 ...

  6. Oracle菜鸟之怎样创建和删除表空间

    1.创建暂时表空间 创建表空间时,dbf文件一般存放在datafile文件的存放文件夹下(通常是在实例名命名的文件夹以下) 能够通过 select * from v$datafile;查看全部数据文件 ...

  7. cocos3.x 实现android沉浸式模式(全屏,隐藏导航栏即虚拟键)

    只有在Android 4.4及以上系统才支持沉浸式模式,修改 AppActivity代码如下: @Override public Cocos2dxGLSurfaceView onCreateView( ...

  8. C++中获取时间

    #include<time.h>    //获取时间头文件//-------------------------------------- clock_t start_time=clock ...

  9. @Override must override a superclass method 有关问题解决

    1.Java开发环境时 如果在使用Eclipse开发Java项目时,在使用 @Override 出现以下错误: The method *** of type *** must override a s ...

  10. AEcs6破解版下载

    下载地址 http://pan.baidu.com/share/link?shareid=79184520&uk=1795677788 点击下载