Redis简介
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(List), 集合(Set) 和有序集合(Sorted Set)等类型。
Redis基本数据结构
如上所述,值有五种类型,以下表格是五种类型的对比,后面系列文章会从底层学习具体细节。
| 结构类型 | 结构存储的值 | 结构的读写能力 |
|---|---|---|
| 字符串 String | 可以是字符串、整数或者浮点数 | 对整个字符串或者字符串其中的一部分执行操作;对整数或者浮点数执行自增或自减操作 |
| 列表 List | 一个链表,链表上的每个节点都包含了一个字符串 | 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪;读取单个或多个元素;根据值查找或者删除元素 |
| 集合 Set | 包含每个字符串都不同的集合 | 添加、获取、删除单个元素;检查一个元素是否存在于一个集合中;计算交集、并集、差集;从集合中随机获取元素 |
| 哈希 Hash | 包含键值对的无序散列表 | 添加、获取、删除单个键值对;获取所有键值对 |
| 有序集合 ZSet | 字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值大小决定 | 添加、获取、删除单个元素;根绝分值范围或者成员来获取元素 |
此外还有三种高级数据结构Geo、HyperLogLog和BitMap,后面可能会有篇幅来细讲。
Redis和其他数据库比较
| 名称 | 类型 | 数据存储选项 | 查询类型 | 附加功能 |
|---|---|---|---|---|
| Redis | 使用内存存储(in-memory)的非关系型数据库 | 字符串、列表、集合、散列表、有序集合 | 每种数据类型都有自己的专属命令,另外还有批量操作和不完全的事务支持 | 发布与订阅,主从复制,持久化,lua脚本 |
| memcached | 使用内存存储的键值缓存 | 键值之间的映射 | 创建命令、读取命令、更新命令、删除命令以及其他几个命令 | 为提升性能而设的多线程服务器 |
| MySQL | 关系数据库 | 每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图;支持空间和第三方拓展 | select、insert、update、delete、函数、存储过程 | 支持ACID性质,主从复制和主主复制 |
| PostgreSQL | 关系数据库 | 每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图;支持空间和第三方拓展;支持可定制类型 | select、insert、update、delete、内置函数、自定义的存储过程 | 支持ACID性质,主从复制,由第三方支持的多主复制 |
| MongoDB | 使用硬盘存储(on-disk)的非关系文档存储 | 每个数据库可以包含多个表,每个表可以包含多个无schema得BSON文档 | 创建命令、读取命令、更新命令、删除命令、条件查询命令等 | 支持map-reduce操作,主从复制,分片,空间索引 |
Redis字符串实现SDS
Redis没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串sds的抽象类型,并将sds用作Redis的默认字符串表示。可用于存储字符串、整数或者浮点数,具体实现细节见下一篇文章。
Redis对象
Redis没有直接使用数据结构来实现键值对数据库,而是基于数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象。
//redis-5.0.10/server.h/redisObject
typedef struct redisObject {
unsigned type:4;//类型
unsigned encoding:4;//编码、底层实现
unsigned lru:LRU_BITS;//记录最后被访问实现,用于键淘汰策略
int refcount;//引用计数
void *ptr;//指向底层实现数据结构的指针
} robj;
类型用于记录是具体五种对象之一的哪一种;编码涉及对象的底层实现,Redis对小对象有优化,不同数据对象会因为大小不同而采用不同的编码方式;lru用于键淘汰策略时记录的最后访问时间;refcount是引用计数,Redis实现了基于引用计数技术的内存回收机制和对象共享机制,但只有只包含整数值的字符串对象才能进行共享;ptr是指向数据结构具体实现的指针。
Redis安装体验
window安装Redis
选择合适的版本,如Redis-x64-5.0.10.msi,下载后安装。
安装过程中可开启redis-server,如未开启可在安装目录下找到redis-server.exe,运行开启Redis服务。
准备完成后,找到redis-cli.exe双击运行。
输入以下命令体验一下
keys *
set hello redis
get hello
linux安装Redis
使用的系统是centos7,仅供参考
# 安装步骤:
# 一、安装gcc
yum install gcc
# 二、下载并解压redis
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar -zxvf redis-5.0.3.tar.gz
# 三、进入解压好的redis-5.0.3目录下,进行编译安装
make
# 四、启动并指定配置文件
# 注意要修改redis.conf的daemonize改为yes
src/redis-server redis.conf
# 五、验证是否启动成功
ps -ef | grep redis
# 六、启动redis客户端并体验
src/redis-cli
set hello redis_in_linux
get hello
# 七、退出客户端
quit
附
以下是部分Redis知识点总结思维导图,后续文章会按照图中模块拆分来学习。
推荐的书:
《Redis实战》
《Redis使用手册》
《Redis实战》
推荐博客、文档、教程: