Redis入门
简介:Redis是一个高性能的Key-Value数据库,redis开源,属于内存数据库,它可以用作数据库、缓存和消息中间件,它支持多种类型的数据结构,如字符串,哈希,列表,集合,有序集合等。
1、安装
1.1 命令行安装
`sudo apt install redis-server`
1.2 命令说明
`redis-server` redis服务器
`redis-cli` redis命令行客户端
`redis-benchmark` redis性能测试工具
`redis-check-aof` AOF文件修复工具
`redis-check-rdb` RDB文件检索工具
2、配置
2.1 配置存放位置
`/etc/redis/redis.conf`
2.2 核心配置选项
(1)绑定ip:如果需要远程访问,可将此行`bind 127.0.0.1`注释,或绑定一个真实ip
(2)端口,默认为6379
(3)是否以守护进程运行`daemonize yes`
1)如果以守护进程运行,则不会在命令行阻塞,类似于服务
2)如果以非守护进程运行,则当前终端将被阻塞
3)设置为yes表示守护进程运行,设置为no表示非守护进程
4)推荐设置为yes
(4)数据文件`dbfilename dump.rdb`
(5)数据文件存储路径`dir /var/lib/redis`
(6)日志文件`logfile /var/log/redis/redis-server.log`
(7)数据库,默认有16个`database 16`
(8)主从复制,类似于双机备份`slaveof`
2.3 参考
https://blog.csdn.net/ljphilp/article/details/52934933
3、客户端和服务端命令
3.1 客户端命令
(1)客户端的命令为`redis-cli`
(2)可以使用help查看帮助文档`redis-cli --help`
(3)数据库没有名称,默认有16个,通过0-15来表示,连接redis默认选择第一个数据库`select n`
3.2 服务端命令
(1)服务端的命令为`redis-server`
(2)可以使用help查看帮助文档`redis-server --help`
(3)启动`sudo service redis-server start`
(4)停止`sudo service redis-server stop`
(5)重启`sudo service redis restart`
(6)查看redis服务器进程`ps -ef | grep redis`
(7)杀死redis服务器`sudo kill -9 pid`
(8)指定加载的配置文件`sudo redis-server /etc/redis/redis.conf`
4、数据操作
数据结构:(1)redis是key-value的数据结构,每条数据都是一个键值对
(2)键的类型是字符串
(3)键不能重复
值的类型分为五种:(1)字符串string(2)哈希hash(3)列表list(4)集合set(5)有序集合zset
数据操作行为:(1)保存(2)修改(3)获取(4)删除
官方中文文档:http://redis.cn/documentation.html
4.1 string类型
字符串类型是redis中最为基础的数据存储类型,它在redis中是二进制安全的,这说明string类型可以接受任何格式的数据,如jepg图像数据或json对象描述信息。
在redis中字符串类型的value最多可容纳的数据长度是512M。
4.1.1 保存
如果设置的键不存在则为添加,如果设置的键已经存在则修改
(1)设置键值`set key value`
(2)获取键值`get key`
(3)设置键值及过期时间,以秒为单位`setex key seconds value`
例如设置a的值为2,过期时间为4秒`setex a 4 2`
(4)设置多个键值`mset key1 value1 key2 value2...`
(5)追加值`append key value`
4.1.2 获取
(1)获取:根据键获取值`get key`,如果不存在此键则返回`nil`
(2)根据多个键获取多个值:`mget key1 key2`
4.1.3 删除
(1)删除键时会将值删除:`del key`
4.2 键命令
查找键,参数支持正则表达式
语法:`keys pattern`
(1)查看所有键:`keys *`
(2)查看名称中包含a的键:`keys a*`
(3)判断键是否存在,如果存在返回1,不存在返回0:`exists key`
(4)查看键对应的value的类型:`type key`
(5)删除键及对应的值:`del key1 key2`
(6)设置过期时间,以秒为单位,如果没有指定过期时间则一直存在,直到使用DEL移除
`expire key seconds`
(7)查看 有效时间,以秒为单位
`ttl key`
4.3 hash类型
(1)hash用于存储对象,对象的结构为属性、值
(2)值的类型为string
4.3.1 增加、修改
(1)设置单个属性:`hset key field value`
(2)设置多个属性:`hmset key field1 value1 field value2 ...`
4.3.2 获取
(1)获取指定键所有的属性:`hkeys key`
(2)获取一个属性的值:`hget key field`
(3)获取多个属性的值:`hmget key field1 field2...`
(4)获取所有属性的值:`hvals key`
4.3.3 删除
(1)删除整个hash键及值,使用del命令
(2)删除属性,属性对应的值会被一起删除:`hdel key field1 field2...`
4.4 list类型
(1)列表的元素类型为string
(2)按照插入顺序排序
4.4.1 增加
(1)在左侧插入数据:`lpush key value1 value2...`
(2)在右侧插入数据:`rpush key value1 value2...`
(3)在指定元素的前或后插入新元素:`linsert key before或after 现有元素 新元素`
4.4.2 获取
返回列表里指定范围内的元素
(1)start、stop为元素的下表索引
(2)索引从左侧开始,第一个元素为0
(3)索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素
语法:`lrange key start stop`
4.4.3 设置指定索引位置的元素值
(1)索引从左侧开始,第一个元素为0
(2)索引可以是负数,表示尾部开始计数,如-1表示最后一个元素
语法:`lset key index value`
4.4.4 删除
删除指定元素
(1)将列表中前count次出现的值为value的元素移除
(2)count>0:从头往尾移除
(3)count<0:从尾往头移除
(4)count=0:移除所有
语法:`lrem key count value`
4.5 set类型
(1)无序集合
(2)元素为string类型
(3)元素具有唯一性,不重复
(4)说明:对于集合没有修改操作
4.5.1 增加
(1)添加元素:`sadd key member1 member2...`
4.5.2 获取
(1)返回所有的元素:`smembers key`
4.5.3 删除
(1)删除指定元素:`srem key member`
4.6 zset类型
(1)sorted set,有序集合
(2)元素为string 类型
(3)元素具有唯一性,不重复
(4)每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序
(5)说明:没有修改操作
4.6.1 增加
语法:`zadd key score1 member1 score2 member2...`
4.6.2 获取
(1)返回指定范围内的元素
(2)start、stop为元素的下标索引
(3)索引从左侧开始,第一个元素为0
(4)索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素
语法:`zrange key start stop`
<1> 返回score值在min和max之间的成员:`zrangebyscore key min max`
<2> 返回成员member的score值:`zscore key member`
4.6.3 删除
(1)删除指定元素:`zrem key member1 member2...`
(2)删除权重在指定范围的元素:`zremrangebyscore key min max`
5、与python交互
引入模块:`from redis import *`
这个模块中提供了StrictRedis对象(Strict严格),⽤于连接redis服务器,并按照不同类型提供 了不同⽅法,进⾏交互操作
5.1 方法
5.1.1 StrictRedis对象方法
通过init创建对象,指定参数host、port与指定的服务器和端⼝连接,host默认为localhost,port默认为6379,db默认为0
`sr = StrictRedis(host='localhost',prot=6379,db=0)`
简写为:
`sr = StrictRedis()`
5.1.2 string的方法
(1)set(2)setex(3)mset(4)append(5)get(6)mget
5.1.3 keys的方法
(1)exists(2)type)(3)delete(4)expire(5)getrange(6)ttl
5.1.4 hash的方法
(1)hset(2)hmset(3)hkeys(4)hget(5)hmget(6)hvals(7)hdel
5.1.5 list的方法
(1)lpush(2)rpush(3)linsert(4)lrange(5)lset(6)lrem
5.1.6 set的方法
(1)sadd(2)smembers(3)srem
5.1.7 zset的方法
(1)zadd(2)zrange(3)zrangebyscore(4)zscore(5)zrem(6)zremrangebyscore
5.2 与python交互
# 导入包 from redis import * # 创建一个StrictRedis对象 sr = StricRedis(host="localhost",prot=6379,db=0) # 操作 #⽅法set,添加键、值,如果添加成功则返回True,如果添加失败则返回False result = sr.set("name","python") # ⽅法get,添加键对应的值,如果键存在则返回对应的值,如果键不存在则返回None result = sr.get("name") #⽅法set,如果键已经存在则进⾏修改,如果键不存在则进⾏添加 result = sr.set("name","it") #⽅法delete,删除键及对应的值,如果删除成功则返回受影响的键数,否则则返 回0 result = sr.delete("name) #⽅法keys,根据正则表达式获取键 result = sr.keys()
6、搭配主从
6.1 主从概念
(1)⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构
(2)master用来写数据,slave用来读数据
(3)通过主从配置可以实现读写分离
(4)master和slave都是一个redis实例(redis服务)
6.2 主从配置
6.2.1 配置主
(1)查看当前主机的ip:`ifconfig`
(2)修改`etc/redis/redis.conf`文件
`sudo vim /etc/redis/redis.conf`
(3)重启redis服务
`sudo service redis-server stop`
`sudo redis-server redis.conf` #进去redis.conf文件目录输入这条命令
(4)查看服务启动消息
`ps aux | grep redis`
6.2.2 配置从
(1)复制`/etc/redis/redis.conf`文件
`sudo cp redis.conf ./slave_redis.conf`
(2)修改redis/slave_redis.conf文件
(1)`修改绑定的ip号: bind 192.168.0.105` # 可以绑定本机,绑定本机时从不能和主有相同端口号
(2)`修改port: port 6378` #本机默认端口号为6379,注意不能重复
(3)默认注释slaveof,需要按照格式重写slaveof
(3)启动从的服务
`sudo redis-server /etc/redis/slave_redis.conf`
(4)查看redis启动的所有服务
`ps aux | grep redis`
(5)查看主从关系
`redis-cli -h 192.168.0.105 info Replication`
6.2.3 数据操作
(1)在master和slave终端下分别执行info命令
`redis-cli -h 192.168.0.105 -p 6379`
`redis-cli -h 192.168.0.105 -p 6379`
(2)在master终端中写入`set a python`
(3)在slave终端中读数据`get a`
7、搭建集群
集群的概念
集群是一组互相独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户端与集群相互作用时,集群就像是一个独立的服务器。集群配置用于提高可用性和可缩放性。
当请求到来时,首先由负载均衡服务器处理,把请求转发到另外的一台服务器上。
redis集群
分类:(1)软件层面(2)硬件层面
软件层面:只有一台电脑,在这一台电脑上启动了多个redis服务。
硬件层面:存在多台实体的电脑,每台电脑上都启动了一个redis或者多个redis服务。
参考阅读:https://www.cnblogs.com/wuxl360/p/5920330.html
7.1 配置主服务器
当前ubuntu机器的ip为:192.168.0.103
在桌面创建conf文件夹,进入并创建文件7000.conf、7001.conf、7002.conf,三个文件的配置区别在port、pidfile、cluster-config-file三项。
(1)编辑7000.conf的内容为
port 7000 bind 192.168.0.103 daemonize yes pidfile 7000.pid cluster-enabled yes cluster-config-file 7000_node.conf cluster-node-timeout 15000 appendonly yes
(2)编辑7001.conf的内容为
port 7001 bind 192.168.0.103 daemonize yes pidfile 7001.pid cluster-enabled yes cluster-config-file 7001_node.conf cluster-node-timeout 15000 appendonly yes
(3)编辑7002.conf的内容为
port 7002 bind 192.168.0.103 daemonize yes pidfile 7002.pid cluster-enabled yes cluster-config-file 7002_node.conf cluster-node-timeout 15000 appendonly yes
(4)使用配置文件启动redis服务
redis-server 7000.conf redis-server 7001.conf redis-server 7002.conf
(5)查看进程
7.2 配置从服务器
当前ubuntu机器的ip为:192.168.0.100
在桌面创建conf文件夹,进入并创建文件7003.conf、7004.conf、7005.conf,三个文件的配置区别在port、pidfile、cluster-config-file三项。
(1)编辑7003.conf的内容为
port 7003
bind 192.168.0.100
daemonize yes
pidfile 7003.pid
cluster-enabled yes
cluster-config-file 7003_node.conf
cluster-node-timeout 15000
appendonly yes
(2)编辑7004.conf的内容为
port 7004
bind 192.168.0.100
daemonize yes
pidfile 7004.pid
cluster-enabled yes
cluster-config-file 7004_node.conf
cluster-node-timeout 15000
appendonly yes
(3)编辑7005.conf的内容为
port 7005
bind 192.168.0.100
daemonize yes
pidfile 7005.pid
cluster-enabled yes
cluster-config-file 7005_node.conf
cluster-node-timeout 15000
appendonly yes
(4)使用配置文件启动redis服务
redis-server 7003.conf
redis-server 7004.conf
redis-server 7005.conf
(5)查看进程
7.3 说明
参考>>>6.2
7.4 创建集群
redis的安装包中包含了redis-trib.rb,用于创建集群
在主服务器(192.168.0.103)上执行命令:
(1)复制redis-trib.rb命令到/usr/local/bin/以便在任何目录下都可以调用此命令
`sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/`
(2)安装ruby环境,redis-trib.rb由ruby开发,运行时需要ruby的支持
`sudo apt-get install ruby`
(3)升级ruby,防止版本过旧无法创建集群
`gem source -l # 查看gem源地址`
`gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ # 更换源`
`sudo gem install redis # 通过gem安装redis的相关依赖,并升级ruby`
(4)执行redis-trib.rb命令创建集群
` redis-trib.rb create --replicas 1 192.168.0.103:7000 192.168.0.103:7001 192.168.0.103:7002 192.168.0.100:7003 192.168.0.100:7004 192.168.0.100:7005`
(5)创建时的命令流
集群搭建成功
7.5 数据验证
当前搭建的主服务器为7000、7001、7003,对应的从服务器是7005、7004、7002
在192.168.0.100上连接7002,加参数-c表示连接到集群
`redis-cli -h 192.168.0.100 -c -p 7002`
当写入数据时,会自动跳转到响应的服务器,并写入数据成功。
7.6 在服务器上写入数据的规则
(1)redis cluster在设计的时候,就考虑到了去中⼼化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各⾃的数据和整个集 群的状态。每个节点都和其他所有节点连接,⽽且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意⼀个节点,就可以获取到其他节点的数据
(2)Redis集群没有并使⽤传统的⼀致性哈希来分配数据,⽽是采⽤另外⼀种叫做哈希槽 (hash slot)的⽅式来分配的。redis cluster 默认分配了 16384 个slot,当我们 set⼀个key 时,会⽤CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到set和get 的时候,直接跳转到了7000端⼝的节点
(3)Redis 集群会把数据存在⼀个 master 节点,然后在这个 master 和其对应的salve 之间进⾏数据同步。当读取数据时,也根据⼀致性哈希算法到对应的 master 节点获取数据。只有当⼀个master 挂掉之后,才会启动⼀个对应的 salve 节点,充当 master
(4)需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数⼩于总节点数的⼀半时,整个集群就⽆法提供服务了。
7.7 与python的交互
(1)安装包`pip install redis-py-cluster`
(2)示例文件如下:
from rediscluster import * if __name__ == '__main__': try: # 构建所有的节点,Redis会使⽤CRC16算法,将键和值写到某个节点上 startup_nodes = [ {'host': '192.192.0.103', 'port': '7000'}, {'host': '192.168.0.100', 'port': '7003'}, {'host': '192.168.0.103', 'port': '7001'}, ] # 构建RedisCluster对象 src=RedisCluster(startup_nodes=startup_nodes,decode_responses=True) # 设置键为name、值为python的数据 result=src.set('name','python') print(result) # 获取键为name name = src.get('name') print(name) except Exception as e: print(e)