Redis基础使用
安装
Linux安装
在终端输入:
$ sudo apt-get install redis-server
安装完后检查是正常安装
$ cd /usr/bin # 进入此目录
$ ls redis*# 查看是否有以下东西
启动
第一次启动:(更新配置文件后也要输入这个,并且要重启服务)
# 授权 启动服务 服务配置文件
$ sudo redis-server /etc/redis/redis.conf
$ sudo service redis-server start # 启动
$ sudo service redis-server stop # 停止
$ sudo service redis-server restart # 重启
查看进程
$ ps -aux|grep redis
进入
$ redis-cli # 默认进入本机的redis
$ redis-cli -h <ip地址> -p <端口号>
# 例:
$ redis-cli -h 127.0.0.1 -p 6379
数据操作
string(类型)
字符串类型是Redis中最为基础的数据存储类型,一个key对应一个value,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
保存
设置键值
如果设置的键不存在则为添加,如果设置的键已经存在则为修改
set key value
# 例 设置name键的值为zhangsan
set name zhangsan
设置键值及过期时间,以秒为单位
setex key seconds value
# 例
setex aa 3 abc # 设置aa属性的值为abc有效值为3
设置多个值
mset key1 value1 key2 value2 key3 value3 ......
追加值
append key value
如果当前属性有值,则会叠加
set a 123
# OK
append a 666
# OK
get a
# 123666
获取
根据键获取值,如果不存在此键则返回nil
$ get key
根据多个键获取多个值
$ mget key1 key2 key3 ......
删除
$ del key
键命令
查找键,参数支持正则表达式
$ keys pattern
查看所有键
$ keys *
查看名称中包含a的键
$ keys 'a*'
判断键是否存在,如果存在返回1,不存在返回0
$ exists key1
查看键对应的value的类型
$ type a1
删除键及对应的值
$ del key1 key2 ......
设置过期时间,以秒为单位
$ expire key seconds
查看有效时间,以秒为单位
$ ttl key
输出为-1是没有设置有效期,输出为-2是有效期过期了
hash(对象)
hash(哈希)类型用于存储对象,对象的结构为{属性:值}
可以存储多个键值对
值的类型为string,
增加、修改
设置单个属性
$ hest key field value
$ hest hash对象名(键名) 属性 值
例1: 设置键 user 的属性 name 为 zhangsan
$ hset user name zhangsan
设置多个值
$ hmset key field1 value1 field2 value2 field3 value3 ......
# 例:设置一个info(hash对象)里边有name属性为张三,age属性为18
$ hmset info name zhangsan age 18
获取
获取指定hash
键所有的属性
$ hkeys key
$ hkeys hash对象名
获取一个hash
键的 属性 的值
$ hget hash对象名 hash对象里的属性
# 例: 获取info(hash对象)里的name属性值
$ hget info name
获取hash
对象的多个属性值
$ hmget key field1 field2 ...
# 例:获取info对象里的name和age属性的值
$ hmget info name age
获取hash对象的所有属性值
$ hvals key
# 例:
$ hvals info
删除
删除hash对象 的 键及值,删除属性时值一起会被删除
$ hdel key field1 field2 ......
list(列表)
Redis列表是简单的字符串列表,和js中的列表一样,但是 按照插入顺序排序 的,也就是最后插入的 字符串 下标是最小的1
增加push
从左侧插入数据lpush
$ lpush key value1 value2
# 例:创建namelist列表,从左边插入名字
$ lpush namelist zhangsan lisi wangwu zhaoliu
从右侧插入数据rpush
$ rpush key value1 value2 ...
# 例:在a1列表的右边插入数据1 2 3 4
$ rpush a1 1 2 3 4
从指定元素的 前或后 插入新元素
$ linsert key before或after 现有元素 新元素
# 例:在键为'a1'的列表中元素'abc'前加入'3'
$ linsert a1 before abc 3
获取lrange
返回列表指定范围内的元素:
- start、stop为元素的下标索引
- 索引从左侧开始,第一个元素为0
- 索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素
$ lrange key start stop
$ lrange 键 开始位置 结束位置
# 例: 查询a1列表的所有值
$ lrange a1 0 -1
修改let
设置指定索引位置的元素值
$ lset key(键) index(下标) value(值)
# 例:设置a1列表下标为2的元素为abc
$ lset a1 2 abc
删除Orem
删除指定元素
将列表中前count次出现的值为value的元素移除
count的绝对值为要删除列表的数量,正负为从左侧还是右侧删除
- count > 0: 从头往尾移除(从左删)
- count < 0: 从尾往头移除(从右删)
- count = 0: 移除所有
$ lrem key count value
# 例:从a1列表左侧(头)开始删除值为abc的3个元素
$ lrem a1 3 abc
# 例:从a1列表右侧(尾)开始删除值为ccc的5个元素
$ lrem a1 -5 ccc
Set(无序集合)
Redis的set集合是string类型的无序集合,元素具有唯一性,不重复(如果有存在的元素,再次添加会报错)。
添加sadd
添加元素
$ sadd key memeber1 member2 ......
# 例:向a3集合中添加元素'zhangsan'、'lisi'、'wangwu'
$ sadd a3 zhangshan lisi wangwu
获取smembers
返回所有的元素:
$ smembers key
# 例:获取键'a3'的集合中所有元素
$ smembers a3
删除
删除指定元素:
$ srem key
# 例:删除a3集合中元素'wangwu'
$ srem a3 wangwu
zset(sorted set:有序集合)
和redise里的set集合一样是string类型元素的集合,且不允许重复的成员,每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序。
增加zadd
score - 权重
member - 成员(值)
$ zadd key(集合名称) score1 member1 score2 member2
# 例:
$ zadd a4 1 zhangsan 2 wangwu 10 king
获取zrange
按指下标范围获取元素
- start、stop为元素的下标索引
- 索引从左侧开始,第一个元素为0
- 索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素
$ zrange key start(开始下标) stop(结束下标)
# 例:a4集合里所有元素
$ zrange a4 0 -1
按指定范围权重获取元素
min最小值、max最大值
$ zrangebyscore key min max
# 例:查找a5列表里权重范围1-10的元素
$ zrangebyscore a5 1 10
删除
删除指定元素
$ zrem key member1 member2 ...
# 例:删除集合'a4'中元素'zhangsan'
$ zrem a4 zhangsan
删除权重在指定范围的元素(min - max)
$ zremrangebyscore key min max
# 例:删除集合a4中权重范围在5、6之间的元素
$ zremrangebyscore a4 5 6
清除redis数据库所有数据
flushall
与Python交互
在python中操作redis数据库,需要安装操作redis的模块
安装redis:
$ pip install redis
使用时要导入模块:
$ from redis import *
模块中提供了StrictRedis对象(Strict-严格),用于连接redis服务,并按照不同类型提供了不同方法,进行交互操作。
StrictRedis对象方法
通过init创建对象,指定参数host、port与指定的服务器和端口连接,host默认为localhost,port默认为6379,db默认为0
sr = StrictRedis(host='localhost',port=6379,db=0)
# 简写
sr = StrictRedis()
根据不同的类型,拥有不同的实际方法可以调用,与前面学的redis命令对应,方法需要的参数与命令的参数一致。
string
- set
- setex
- mset
- get
- mget
- key
keys
string | keys | hash | list | set | zset |
---|---|---|---|---|---|
set(设置值) | exists(判断是否存在) | hset | lpush | sadd | zadd |
setex(设置键值及过期时间) | type(判断值的类型) | hmset | rpush | smembers | zrange |
mset(设置多个值) | del(删除键) | hkeys | linsert | srem | zrangebyscore |
append(添加) | expire(设置键的过期时间) | hget | lrange | zscore | |
get(获取值) | getrange() | hmget | lset | zrem | |
mget(获取多个值) | ttl | hvals | lrem | zremrangebyscore | |
key(获取所有键) | heel |
主从搭建
查看主从服务器的状态
未连接的情况下
$ redis-cli -h <ip地址> -p <端口> info Replication
连接了的情况下
>>> info replication
例:
常用配置文件例子 redis.conf
#默认端口6379
port 6379
#绑定ip,如果是内网可以直接绑定 127.0.0.1, 或者忽略, 0.0.0.0是外网
bind 0.0.0.0
#守护进程启动
daemonize yes
#超时
timeout 300
loglevel notice
#分区
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
#存储文件
dbfilename dump.rdb
#密码 abcd123
requirepass abcd123
添加哨兵
Redis sentinel介绍
Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移。
(sentinel - 哨兵)
配置哨兵文件
# 端口
port 27000
# 是否后台启动
daemonize yes
# pid文件路径
pidfile /var/run/redis-sentinel.pid
# 日志文件路径
logfile "/var/log/redis/sentinel.log"
# rdb数据备份的目录
dir /var/lib/redis
# 定义Redis主的别名, IP, 端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
sentinel monitor mymaster 127.0.0.1 6379 2
# 如果mymaster 30秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 30000
# 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel parallel-syncs mymaster 1
# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000
# 不允许使用SENTINEL SET设置notification-script和client-reconfig-script
sentinel deny-scripts-reconfig yes
每个哨兵都有一个自己的端口号
注意⚠️:端口号不要重复
哨兵全都要监视主服务器
查看linux里的redis进程
$ ps -aux|grep redis
杀死进程
$ sudo kill 进程id
开启哨兵 后面添加–sentinel
$ sudo redis-server sentinel01.conf --sentinel
系统默认启动的redis服务 用kill杀不死进程 如何关闭?
$ /etc/init.d/redis-server stop
用redic-cli 连接服务器后 检查主从状态
>>> info replication
(replication - 回复)
python中使用哨兵
from redis import Redis
from redis.sentinel import Sentinel
# redis 哨兵的地址和端口
REDIS_SENTINELS = [
('127.0.0.1', '27000'),
('127.0.0.1', '27001'),
('127.0.0.1', '27002'),
]
# 获取哨兵对象 存到app对象里,在视图中可以通过current_app获取到
_sentinel = Sentinel(REDIS_SENTINELS)
# 监控的节点名字 mymaster
REDIS_SENTINEL_SERVICE_NAME = 'mymaster'
def main():
# 通过哨兵对象 获取主节点对象 用来写入信息
redis_master: Redis = _sentinel.master_for(REDIS_SENTINEL_SERVICE_NAME)
# 通过哨兵对象 获取从节点对象 用来获取信息
redis_slave = _sentinel.slave_for(REDIS_SENTINEL_SERVICE_NAME)
# 写入数据
redis_master.hset('person', 'name', 'xiaoming')
# 获取数据 得到的是byte类型数据 需要decode解码
name = redis_slave.hget('person', 'name')
print(name.decode())
if __name__ == '__main__':
main()
搭建集群
集群(cluster):
同时有很多服务器做一样的事情
分布式:
将功能分成多个步骤,每个服务器做一个步骤
分布式+集群:
将功能分成多个步骤,每个步骤由一个集群来做
开启集群的命令
redis-cli --cluster create 127.0.0.1