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