Redis - 概述及语法
一、NoSQL数据库(not only sql)
泛指非关系型的数据库
不支持SQL语法
存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式
NoSQL的世界中没有一种通用的语言,每种nosql数据库都有自己的api和语法,以及擅长的业务场景
NoSQL中的产品种类相当多:
- Redis
- Mongodb
- Hbase hadoop
- Cassandra hadoop
NoSQL和SQL数据库的比较:
- 适用场景不同:sql数据库适合用于关系特别复杂的数据查询场景,nosql反之
- 事务特性的支持:sql对事务的支持非常完善,而nosql基本不支持事务
- 两者在不断地取长补短,呈现融合趋势
二、Redis概念
1. Redis简介
- Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助
- Redis是 NoSQL技术阵营中的一员,它通过多种键值数据类型来适应不同场景下的存储需求,借助一些高层级的接口使用其可以胜任,如缓存、队列系统的不同角色
2. Redis特性
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
- Redis支持数据的备份,即master-slave模式的数据备份
3. Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作
- 原子性 – Redis的所有操作都是原子性的
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性
4. Redis应用场景
- 用来做缓存(ehcache/memcached)——Redis的所有数据是放在内存中的(内存数据库)
- 可以在某些特定应用场景下替代传统数据库——比如社交类的应用
- 在一些大型系统中,巧妙地实现一些特定的功能:session共享、购物车
三、Redis的安装与配置
1. 安装Redis
此处为语雀内容卡片,点击链接查看:https://www.yuque.com/wuhuibianque/vrvio8/ea6r8z
2. 配置Redis
查看Redis的配置文件:
sudo vi /etc/redis/redis.conf
核心配置选项
- 绑定IP:
bind 127.0.0.1
- 绑定IP:
- 如果redis的ip地址不是本地回环127.0.0.1,需要改为正确的ip地址
- 如果需要远程访问,需要绑定远程主机ip:
bind 192.168.XX.XX 127.0.0.1
- 端⼝,默认为6379:
port 6379
- 是否以守护进程运⾏:
daemonize yes
- 端⼝,默认为6379:
- 如果以守护进程运⾏,则不会在命令⾏阻塞,类似于服务
- 如果以⾮守护进程运⾏,则当前终端被阻塞
- 设置为yes表示守护进程(推荐),设置为no表示⾮守护进程
- redis数据⽂件(默认在home文件夹):
dbfilename dump.rdb
- 数据⽂件存储路径:
dir /var/lib/redis
- ⽇志⽂件:
logfile "/var/log/redis/redis-server.log"
- 数据库,默认有16个:
database 16
- 主从复制,类似于双机备份:
slaveof
- redis数据⽂件(默认在home文件夹):
配置允许远程访问(关闭保护模式):
protected-mode no
四、Redis服务端和客户端命令
1. 服务器端
- 启动Redis服务器(指定加载的配置文件):
sudo redis-server /etc/redis/redis.conf
- 使⽤help查看帮助⽂档:
redis-server --help
- 查看Redis服务器进程:
ps aux | grep redis
- 杀死Redis服务器:
sudo kill -9 pid
启动redis-server的警告问题
redis启动后的警告问题_炎升的博客-CSDN博客_redis 启动警告
2. 客户端
使⽤help查看帮助⽂档:
redis-cli --help
连接Redis服务器:
redis-cli
/redis-cli -h 127.0.0.1 -p 6379
连接Redis服务器后
- 运⾏测试命令:
ping
- 切换数据库(默认16个,标识0-15,连接Redis默认选择第1个数据库):
select 标识数字
- 运⾏测试命令:
五、Redis数据操作
1. 数据结构
Redis是key-value的数据结构,每条数据都是⼀个键值对
键:字符串类型,不能重复
值的类型分为五种
- 字符串:string
- 哈希:hash
- 列表:list
- 集合:set
- 有序集合:zset
2. 键命令
命令 | 说明 |
---|---|
keys * | 查看所有键 |
keys 参数 | 查找键,参数支持正则表达式 |
exists 键 | 判断键是否存在,存在返回1,不存在返回0 |
type 键 | 查看键对应的值的类型 |
del 键1[,键2…] | 删除键 |
expire 键 时长 | 给键设置设置过期时间(单位:秒),若没指定则一直存在 |
ttl 键 | 查看有效时间(单位:秒) |
3. string类型
- string类型:字符串类型是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M
(1)增加修改
- 如果设置的键不存在则为添加,如果设置的键已经存在则修改
命令 | 说明 |
---|---|
set 键 值 | 设置键值 |
setex 键 时长 值 | 设置键值及过期时间(单位:秒) |
mset 键1 值1 键2 值2 … | 设置多个键值 |
append 键 值 | 追加值 |
(2)获取
命令 | 说明 |
---|---|
get 键 | 根据键获取值,如果不存在此键则返回nil |
mget 键1 键2 … | 根据多个键获取多个值 |
(3)删除
- 删除键时会将值删除
4. hash类型
- hash用于存储对象,对象的结构:
属性:值
,值的类型为string
(1)增加修改
- 如果设置的键不存在则为添加,如果设置的键已经存在则修改
命令 | 说明 |
---|---|
hset 键 属性 值 | 设置单个属性 |
hmset 键 属性1 值1 属性2 值2 | 设置多个属性 |
(2)获取
命令 | 说明 |
---|---|
hkeys 键 | 获取指定键的所有属性 |
hget 键 属性 | 获取指定键的一个属性值 |
hmget 键 属性1 属性2 | 获取指定键的多个属性值 |
hvals 键 | 获取指定键所有属性的值 |
(3)删除
- 删除键时会删除整个hash键及值
- 删除属性,属性对应的值会被一起删除:
hdel 键 属性1[ 属性2..]
5. list类型
- 列表的元素类型为string
- 按照插入顺序排序
(1)增加
命令 | 说明 |
---|---|
lpush 键 值1 值2 | 从键的列表左侧插入数据 |
rpush 键 值1 值2 | 从键的列表右侧插入数据 |
linsert 键 before 指定元素 插入元素 | 从键的列表指定元素前插入数据 |
linsert 键 after 指定元素 插入元素 | 从键的列表指定元素后插入数据 |
(2)获取
命令 | 说明 |
---|---|
lrange 键 开始索引 结束索引 | 返回列表里指定范围内的元素索引从左侧开始,第一个元素为0索引可以是负数,表示从尾部开始计数,-1表示最后一个元素 |
(3)修改
命令 | 说明 |
---|---|
lset 键 索引 值 | 设置指定索引位置的元素值 |
(4)删除
命令 | 说明 |
---|---|
lrem 键 次数 值 | 移除列表中出现指定次数的指定值的元素次数大于0:从头往尾移除次数小于0:从尾往头移除次数等于0:移除所有 |
6. set类型
- 无序集合
- 元素为string类型
- 元素具有唯一性
- 没有修改操作
(1)增加
命令 | 说明 |
---|---|
sadd 键 元素1 元素2 | 向指定键的集合中添加元素 |
(2)获取
命令 | 说明 |
---|---|
smembers 键 | 获取指定键的集合中所有元素 |
(3)删除
命令 | 说明 |
---|---|
srem 键 值 | 删除指定元素 |
7. zset类型
- 有序集合
- 元素为string类型
- 元素具有唯一性
- 没有修改操作
- 每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序
(1)增加
命令 | 说明 |
---|---|
zadd 键 权重1 元素1 权重2 元素2 | 向指定键的集合中添加元素 |
(2)获取
命令 | 说明 |
---|---|
zrange 键 开始索引 结束索引 | 返回指定范围内的元素索引从左侧开始,第一个元素为0索引可以是负数,表示从尾部开始计数,-1表示最后一个元素 |
zrangebyscore 键 min权重 max权重 | 返回权重在指定范围的元素 |
zscore 键 元素 | 返回元素的权重值 |
(3)删除
命令 | 说明 |
---|---|
zrem 键 元素1 元素2 | 删除指定元素 |
zremrangebyscore 键 min权重 max权重 | 删除权重在指定范围的元素 |
六、搭建主从
- 主从概念:⼀个master(主)可以拥有多个slave(从),⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构,master用来写数据,slave用来读数据,通过主从配置可以实现读写分离
- master和slave都是一个redis实例(redis服务)
1. 配置主
查看当前主机的ip地址:
ifconfig
修改/etc/redis/redis.conf文件:
sudo vi redis.conf
- 修改内容:
bind 192.168.XX.XX
- 修改内容:
重启redis服务
2. 配置从
复制/etc/redis/redis.conf文件:
sudo cp redis.conf ./slave.conf
修改redis/slave.conf文件:
sudo vi slave.conf
- 编辑内容:
- bind 192.168.XX.XX
- port 6378
- replicaof 192.168.XX.XX 6379
启动redis服务:
sudo redis-server slave.conf
- 查看主从关系:
redis-cli -h 192.168.XX.XX info Replication
3. 数据操作
在master和slave分别执⾏命令查看输出信息
- 进入主客户端:
redis-cli -h 192.168.XX.XX -p 6379
- 在master上写数据
- 进入主客户端:
- 进入从的客户端:
redis-cli -h 192.168.26.128 -p 6378
- 在slave上读数据
- 进入从的客户端:
七、搭建集群
集群的概念:集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性当请求到来首先由负载均衡服务器处理,把请求转发到另外的一台服务器上
redis集群分类
- 软件层面:只有一台电脑,在这一台电脑上启动了多个redis服务
- 硬件层面:存在多台实体的电脑,每台电脑上都启动了一个redis或者多个redis服务
1. 配置机器
- 在主机上创建一个⽬录文件,文件下创建6个⽂件conf文件,编辑内容如下
1 | # 端口号 6个文件依次修改为7000 7001 7002 7003 7004 7005 |
- 使⽤配置⽂件启动6个redis服务
- 查看进程
2. 创建集群
复制Redis集群命令行工具文件:
sudo cp /usr/local/redis/src/redis-trib.rb /usr/local/bin/
安装ruby环境(因为redis-trib.rb是⽤ruby开发的):
sudo apt-get install ruby
运⾏命令创建集群:
redis-cli --cluster create 192.168.XX.XX:7000 192.168.XX.XX:7001 192.168.XX.XX:7002 192.168.XX.XX:7003 192.168.XX.XX:7004 192.168.XX.XX:7005 --cluster-replicas 1
若此步骤出错可能是因为Ruby非最新版本,需要设置 gem 的源,解决办法如下
查看本机的gem源地址(如果是https://rubygems.org/ 就需要更换):
gem source -l
更换gem源:
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
通过gem安装redis相关依赖:
sudo gem install redis
提示如下主从信息,输⼊yes后回⻋
- 提示完成,集群搭建成功
3. 数据验证
- 连接到集群:
redis-cli -h 192.168.241.128 -c -p 7000
- 写⼊数据,会⾃动定向到7001服务器
- 在7001可以获取数据,如果写入数据,则又会重定向到7000(负载均衡)
4. 集群原理
redis cluster在设计的时候,就考虑到了去中⼼化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各⾃的数据和整个集群的状态
每个节点都和其他所有节点连接,⽽且这些连接保持活跃,这样就保证了只需要连接集群中的任意⼀个节点,就可以获取到其他节点的数据
Redis集群没有并使⽤传统的⼀致性哈希来分配数据,⽽是采⽤另外⼀种叫做哈希槽 (hash slot)的⽅式来分配的。
- redis cluster 默认分配了16384个slot,当我们 set⼀个key 时,会⽤CRC16算法来取模得到所属的slot,然后将这个key分到哈希槽区间的节点上
- 具体算法:CRC16(key) % 16384
- 所以在测试的时候看到set和get的时候,直接跳转到了7000端⼝的节点
Redis 集群会把数据存在⼀个master节点,然后在这个master和其对应的salve之间进⾏数据同步
- 当读取数据时,也根据⼀致性哈希算法到对应的 master 节点获取数据
- 只有当⼀个master 挂掉之后,才会启动⼀个对应的 salve 节点,充当master
需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数⼩于总节点数的⼀半时,整个集群就⽆法提供服务了
5. Python交互
此处为语雀内容卡片,点击链接查看:https://www.yuque.com/wuhuibianque/epxczt/dgvzpe
附录-参考资料
Redis官方网站
Redis中文官网
Redis官方文档
https://redis-py.readthedocs.io/en/latest/#indices-and-tables
Redis命令中心
Redis学习教程
Redis服务器配置
django-redis-session配置_ljphilp的博客-CSDN博客