Redis是一个基于内存的数据库,所有的数据都存储在内存中.所以如何优化存储,减少内存空间占用是一个非常重要的话题.精简键名和键值是最直观的减少内存占用的方式,如将键名very.important.person:20改成VIP:20. 但有时仅凭精简键名和键值所减少的空间并不足以满足需求,这时就需要根据Redis内部编码规则来节省更多的空间. Redis为每种数据类型都提供了两种内部编码方式,以散列类型为例,散列类型是通过散列表实现的,这样就可以实现O(1)时间复杂度的查找.赋值操作,然而当键中…
Redis的每个键值都是使用一个redisObject结构体保存的,redisObject的定义如下: typedef struct redisObject { unsigned type:4; unsigned notused:2; /* Not used */ unsigned encoding:4; unsigned lru:22; /* lru time (relative to server.lruclock) */ int refcount; void *ptr; } robj; 1…
一:简介 Redis是一个开源的高性能key-value数据库.Redis是Remote DIctionary Server(远程字典服务器)的缩写,它以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容.Redis字典中的value支持的数据类型有:字符串,散列,列表,集合,有序集合. Redis数据库中的所有数据都存储在内存中,内存的读写速度远快于硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势.但是将数据存储在内存中也有问题,程序退出后内存中的数据会丢失…
一:热身 获得符合规则的健名列表:keys  pattern pattern支持glob风格的通配符,具体规则如下表: Redis命令不区分大小写.keys命令需要遍历Redis中的所有健,当键的数量较多时会影响性能,不建议在生产环境中使用. 判断一个键是否存在:exists  key 如果键存在则返回整数类型1,否则返回0. 删除键:del  key [key ...] 返回值是删除键的个数,del命令的参数不支持通配符. 获取键值的数据类型:type  key 返回值可能是string(字符…
即使使用哨兵,此时的 Redis 集群的每个数据库依然存有集群中的所有数据,从而导致集群的总数据存储量受限于所有节点中,内存最小的数据库节点,形成木桶效应. 对 Redis 进行水平扩容,在旧版Redis 中通常使用客户端分片来解决这个问题,即启动多个 Redis 数据库节点,由客户端决定每个键交由哪个数据库节点存储,下次客户端读取该键时直接到该节点读取. 这种实现将整个数据分布存储在N个数据库节点中,每个节点只存放总数据量的 1/N.但对于需要扩容的场景来说,在客户端分片后,如果想增加更多的节…
一:事务 1:概述 Redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行. 事务的原理是是先将属于一个事务的所有命令都发送给Redis,然后再让Redis依次执行这些命令.比如: > multi OK > sadd aset QUEUED > sadd aset QUEUED > exec ) (integer) ) (integer) 上面的代码演示了事务的使用方式.首先使用multi命…
现实项目中通常需要若干台Redis服务器的支持: 结构上,单个 Redis 服务器会发生单点故障,而且一台服务器需要承受所有的请求负载.这就需要为数据生成多个副本并分配在不同的服务器上: 容量上,单个 Redis 服务器的内存非常容易成为存储瓶颈,所以需要进行数据分片. 同时拥有多个 Redis 服务器后就会面临如何管理集群的问题,包括如何增加节点.故障恢复等操作. 一:复制(replication) 为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器…
一:安全 1:可信的环境 Redis以简洁为美.在安全层面Redis也没有做太多的工作.Redis的安全设计是在"Redis运行在可信环境"这个前提下做出的.在生产环境运行时不能允许外界直接连接到 Redis 服务器上,而应该通过应用程序进行中转,运行在可信的环境中是保证Redis安全的最重要方法. Redis的默认配置会接受来自任何地址发送来的请求,要更改这一设置,可以修改配置文件中的bind参数,如只允许若干IP连接Redis,可如下修改: bind 192.168.1.100 1…
Redis的强劲性能很大程度上是由于将所有数据都存储在了内存中,然而当Redis重启后,所有存储在内存中的数据就会丢失.在一些情况下,希望Redis能将数据从内存中以某种形式同步到硬盘中,使得重启后可以根据硬盘中的记录恢复数据.这一过程就是持久化. Redis支持两种方式的持久化,一种是RDB方式,另一种是AOF方式.前者会根据指定的规则将内存中的数据存储在硬盘上,而后者在每次执行命令后将命令本身记录下来.两种持久化方式可以单独使用其中一种,但更多情况下是将二者结合使用. 一:RDB方式 RDB…
第1章 简介 1.1 历史与发展 2008年 意大利创业公司创始人因对mysql性能不满意,于是他决定开发redis. 2009年 redis初版由他一个人开发完成.redis是"remote dictionary server"的缩写. redis最新版为4.0.6.   1.2 特性 redis是一个字典结构的存储服务器,支持5种数据类型:字符串.散列.列表.集合.有序集合. 所有数据都存储在内存中.通过TCP协议与客户端连接. 简单稳定:使用C语言编写,3万行代码量. TTL:t…