¶一、简介
Redis
是key-value
(键值对)的存储系统。支持存储的value
类型相对更多,包括string
、list
、set
(集合)、zset
(有序集合)和hash
(哈希类型),算一种nosql内存型缓存数据库。
NoSQL
,指的是非关系型的数据库。NoSQL
有时也称作Not Only SQL
的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL
一般应用于超大规模数据的存储。关系型数据库已经不适合处理当今成倍数据量增加的大型互联网商务应用了。这时nosql
数据库由于其更高的性能、更快的速度、更好的可扩展性等优势对解决大规模数据起到了良好的应用作用。
NoSQL四大分类
分类 | Examples举例 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值(key-value) | Redis,Tokyo Cabinet/Tyrant, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDb | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
NoSQL适用场景:1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。
通俗来说,Oracle
、mysql
、sqlserver
等这样的关系型数据库主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。而redis
主要将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但相应的保存时间有限。
使用Redis
的情景一般是会话缓存(session cache
),用Redis
缓存会话比其他存储(如Memcached
)的优势在于:Redis
提供持久化,即可以将内存中的数据序列化到硬盘中,如此以确保用户数据的安全性。此外Redis
哎集群方面具有很好的优势。
NoSQL优缺点
优点 | 缺点 |
---|---|
数据高并发读写 | ACID相比于关系型数据库过于简单 |
海量数据存储和访问效率高 | 无法做太复杂的关系数据库模型 |
对数据可扩展且高可用 |
¶二、安装
¶1、window下安装
步骤大致如下:
¶1.1 下载
下载地址:https://github.com/microsoftarchive/redis/releases
¶1.2 启动和关闭
解压到任意目录后,点击安装目录里的redis-server.exe即可启动,关闭redis-server.exe启动的窗口即可关闭。
¶1.3 开启后台守护进程
cmd进入安装目录并执行以下命令即可安装成系统守护进程服务。(当然你可以将安装目录放到环境变量中,就可以在任意目录执行redis命令了,这里为了简便就不做此操作了)
1 | redis-server --service-install redis.windows-service.conf --loglevel verbose |
(1)启动和关闭守护进程服务
1 | 启动(如果启动失败,在安装目录里创建一个名称为Logs的文件夹即可) |
¶1.4 卸载
-
如果没有开启守护进程服务,那么直接删除安装目录即可卸载。
-
如果开启守护进程服务,那么可在安装目录里通过执行以下命令来卸载守护进程服务,执行该命令后删除安装目录即可完全卸载。
1 | redis-server --service-uninstall |
更多内容可参考菜鸟教程。
¶2、Linux下安装
这里主要讲linux
下编译安装。
¶2.1 下载
下载地址: https://redis.io/download ,这里使用的是3.0版本。
1 | 下载redis-3.0.0 |
¶2.2 安装
1 | 解压到/usr/local/ |
看到类似“Hint: It's a good idea to run 'make test' ;)
”这样的提示表示编译完成。make 后编译好的文件会保存到src目录下。这些文件中有两个重要的文件:
redis-server 服务端程序
redis-cli 客户端程序
其实这个时候我们已经可以执行redis-server
和redis-cli
直接使用了,但为了更好的管理程序,我们可以将这些编译好的文件和配置文件移动到其他目录去。如/usr/local/redis/bin/
和/usr/local/redis/etc/
。
1 | 创建两个目录用来存放redis配置文件和编译好的文件 |
¶2.3 卸载
直接删除/usr/local/redis-3.0.0
、/usr/local/redis/bin/
和/usr/local/redis/etc/
目录即可完成卸载。
¶2.4 启动服务端
1 | redis-server + redis配置文件 一起启动服务 |
可以通过打开另一个终端执行ps -ef | grep redis
或者 ps -ef | grep 6379
查看redis
线程。
可以按Ctrl+C
中断停止服务端启动。
¶2.5 配置服务端
默认开启redis-server
需要保持当前终端开启才能使用,如果关闭当前终端或者中断进程了那么服务就关闭了,如果希望后台启守护进程,我们可以修改redis
的配置文件,修改daemonize
的值为yes
来实现。
1 | vim /usr/local/redis/etc/redis.conf |
注意重启redis-server后才能生效
以下是其他配置,但学习的话并不建议
1 | port 6379 #默认端口,可以修改 |
¶2.6 启动服务端守护进程
1 | /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf |
¶2.7 关闭服务端守护进程
1 | /usr/local/redis/bin/redis-cli shutdown |
¶2.8 客户端使用
(1)启动客户端
1 | /usr/local/redis/bin/redis-cli |
(2)关闭客户端
按Ctrl+C
就能停止客户端启动
¶三、常用命令大全
¶1. key相关
1 | keys * #查询当前库的所有键 |
案例
(1)查询当前库的所有键
1 | 127.0.0.1:6379> keys * |
(2)修改 key的名称
1 | 127.0.0.1:6379> set name qcmoke |
¶2. String相关
1 | set key value #添加键值对 |
案例
(1)添加键值对
set key value
1 | 127.0.0.1:6379> set name zhangsan |
如果已经存在相应的key/value
,那么会将原本的值覆盖掉。添加完成后,会根据配置文件中的dir
的路径每隔一段时间序列化生成dump.rdb
文件。这个文件可以备份和删除,但删除了相应的数据库中就没有相应的数据了,故不要轻易的删除,这很危险。
setnx key value
如果不存在key则设置,如果存在key则不设置
1 | 127.0.0.1:6379> setnx name qcmoke |
(2)查询对应键值
get key
1 | 127.0.0.1:6379> get name |
(3)删除已存在的键
del key
1 | 127.0.0.1:6379> del name |
¶3. 哈希(Hash)
1 | HDEL key field1 [field2] #删除一个或多个哈希表字段 |
案例
(1)将哈希表 key 中的字段 field 的值设为 value
1 | 127.0.0.1:6379> hmset user age 21 |
(2)将多个 field-value (域-值)对设置到哈希表 key 中
1 | 127.0.0.1:6379> hmset user name zhangsan description "a good boy" |
(3)从hash里获取指定字段的值
1 | 127.0.0.1:6379> hget user name |
(4)从hash获取指定 key 的所有字段和值
1 | 127.0.0.1:6379> hgetall user |
(5)从hash获取指定 key 的所有值
1 | 127.0.0.1:6379> hvals user |
¶4. 列表(List)
根据收尾添加的不同,既可以实现栈,也可以实现队列。
1 | BLPOP key1 [key2 ] timeout # 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
案例
(1)将一个或多个值插入到列表头部
1 | 127.0.0.1:6379> lpush lkey zhangsan |
(2)获取列表指定范围内的元素
1 | 127.0.0.1:6379> LRANGE lkey 0 10 |
¶5. 集合Set
1 | SADD key member1 [member2] #向集合添加一个或多个成员 |
案例
(1)向集合添加一个或多个成员
1 | 127.0.0.1:6379> sadd skey zhangsan |
(2)返回集合中的所有成员
1 | 127.0.0.1:6379> smembers skey |
¶6. 有序集合(sorted set)
1 | ZADD key score1 member1 [score2 member2] #向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
案例
(1)向有序集合添加一个或多个成员,或者更新已存在成员的分数
1 | 127.0.0.1:6379> zadd sskey 1 zhangsan |
(2)过索引区间返回有序集合成指定区间内的成员
1 | 127.0.0.1:6379> zrange sskey 0 10 |
(3)取分数和值
1 | 127.0.0.1:6379> zrange sskey 0 10 WITHSCORES |
¶7. 高级命令
1 | select [数据库下标] #选择数据库,数据库为0--15(16个),默认进入第0个 |
案例
(1)切换到下标为某个数字的数据库
1 | 127.0.0.1:6379> select 1 |
(2)清空当前数据库的key
1 | 127.0.0.1:6379> flushdb |
关键字可大小写
更多命令请参考:https://redis.io/commands
¶四、Redis Cluster 集群搭建
Redis Cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点对外提供读写操作,而从节点对外仅能够提供读操作,另外从节点还能复制主节点数据进行备份,当某个主节点挂掉后,就会通过其从节点中选取一个来充当主节点,从而保证集群的高可用。
cluster集群的是采用“虚拟哈希槽分区”的方式进行分片存储的,它将整个数据库分为16384个槽位slot,所有key-value数据都存储在这些slot中的某一个上。一个slot槽位可以存放多个数据,key的槽位计算公式为:slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数。
每一个主节点集群(主节点和其从节点组成的小集群)都负责维护一部分槽以及槽所映射的键值数据。扩容或缩容以后,槽需要重新分配,数据也需要重新迁移,但是服务不需要下线。由于Redis集群无中心节点,请求会随机发给任意主节点;主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误;客户端根据错误中包含的地址和端口重新向正确的负责的主节点发起命令请求。
¶1、环境准备
redis要求至少三主三从共6个节点才能组成redis集群,可以分布在一台或者多台主机上。假设有两台服务器用于搭建Redis Cluster集群。两台服务器的IP分别是:192.168.102.111和192.168.102.112。每个服务器跑三个不同端口(6371、6372、6373)的redis服务进程,那么就能在这两台服务器中搭建出6个redis节点出来。这里通过使用redis配置模板文件和docker compose来简化搭建过程,在每台服务器上完成如下步骤
(1)确保安装好docker和docker-compose,可参考《Docker学习笔记》。
(2)关闭掉防火墙
1 | service firewalld stop |
(3)操作目录准备
1 | 创建目录 |
¶2、创建redis配置模板文件
1 | vi redis-cluster.tmpl |
加入内容如下:
1 | #节点端口 |
修改宿主机IP cluster-announce-ip;然后还要修改登录密码requirepass和masterauth(统一用一个密码就好)
执行如下命令完成一个服务器三个不同端口的redis服务节点创建
1 | for port in `seq 6371 6373`; do \ |
¶5、创建docker compose配置文件
1 | vim docker-compose.yml |
内容如下:
1 | # 描述 Compose 文件的版本信息 |
修改volumes中宿主机的挂载目录路径即可
按照 Redis 官网:https://redis.io/topics/cluster-tutorial 的提示,为了使 Docker 与 Redis Cluster 兼容,您需要使用 Docker 的
host
网络模式。
创建并启动所有服务容器
1 | docker-compose up -d |
¶6、初始化并创建集群
首先确保两台服务器之间可以互相通信,然后选择任意一台并登录进一个redis服务,并通过redis客户端命令来初始化创建出一个Cluster集群。
1 | 进入容器 |
查看集群状态、信息和节点信息
1 | 通过宿主机进入容器 |
¶7、集群扩容
1 | 新增一个节点(默认是主节点的方式加入),将新节点介绍给集群中的任意一个,那么整个集群的所有节点就能与新节点互相认识 |
1 | root@bogon:/data# redis-cli -a 123456 --cluster reshard 192.168.102.133:6371 |
¶8、参考
https://juejin.cn/post/6870674824247640072