安装

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

stringkeyshashlistsetzset
set(设置值)exists(判断是否存在)hsetlpushsaddzadd
setex(设置键值及过期时间)type(判断值的类型)hmsetrpushsmemberszrange
mset(设置多个值)del(删除键)hkeyslinsertsremzrangebyscore
append(添加)expire(设置键的过期时间)hgetlrangezscore
get(获取值)getrange()hmgetlsetzrem
mget(获取多个值)ttlhvalslremzremrangebyscore
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