Redis 是一个高性能的key-value数据库。本文会让你知道:什么是 nosql、Redis 的特点、如何修改常用Redis配置、写出Redis中string类型数据的增删改查操作命令、写出Redis中hash类型数据的增删改查相关命令、说出Redis中 list 保存的数据类型、使用StrictRedis对象对string类型数据进行增删改查、参考课件步骤搭建 Redis 集群
全套Redis笔记地址: 请移步这里
共 1 章,19 子模块
学习目标
- 能够写出Redis中string类型数据的增删改查操作命令
- 能够写出Redis中hash类型数据的增删改查相关命令
重要文档
- Redis 参考命令
- Redis 官方文档
数据结构
- redis是key-value的数据结构,每条数据都是⼀个键值对
- 键的类型是字符串
- 注意:键不能重复
-
值的类型分为五种:
- 字符串string
- 哈希hash
- 列表list
- 集合set
- 有序集合zset
数据操作行为
- 保存
- 修改
- 删除
点击中⽂官⽹查看命令⽂档http://redis.cn/commands.html
学习目标
- 能够说出Redis中 list 保存的数据类型
list类型
- 列表的元素类型为string
- 按照插⼊顺序排序
增加
- 在左侧插⼊数据
lpush key value1 value2 …
- 例1:从键为
a1
的列表左侧加⼊数据a 、 b 、c
lpush a1 a b c
- 在右侧插⼊数据
rpush key value1 value2 …
- 例2:从键为
a1
的列表右侧加⼊数据0、1
rpush a1 0 1
- 在指定元素的前或后插⼊新元素
linsert key before或after 现有元素 新元素
- 例3:在键为
a1
的列表中元素b
前加⼊3
linsert a1 before b 3
-
返回列表⾥指定范围内的元素
start
、stop
为元素的下标索引- 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示从尾部开始计数,如
-1
表示最后⼀个元素
lrange key start stop
- 例4:键为
a1
的列表所有元素
lrange a1 0 -1
设置指定索引位置的元素值
- 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示尾部开始计数,如
-1
表示最后⼀个元素
lset key index value
- 例5:修改键为
a1
的列表中下标为1
的元素值为z
lset a 1 z
删除
-
删除指定元素
- 将列表中前
count
次出现的值为value
的元素移除 - count > 0: 从头往尾移除
- count < 0: 从尾往头移除
- count = 0: 移除所有
- 将列表中前
lrem key count value
- 例6.1:向列表
a2
中加⼊元素a、b、a、b、a、b
lpush a2 a b a b a b
- 例6.2:从
a2
列表右侧开始删除2个b
lrem a2 -2 b
- 例6.3:查看列表
a2
的所有元素
lrange a2 0 -1
set类型
- ⽆序集合
- 元素为string类型
- 元素具有唯⼀性,不重复
- 说明:对于集合没有修改操作
增加
- 添加元素
sadd key member1 member2 …
- 例1:向键
a3
的集合中添加元素zhangsan
、lisi
、wangwu
sadd a3 zhangsan sili wangwu
- 返回所有的元素
smembers key
- 例2:键
a3
的集合中所有元素
smembers a3
删除
- 删除指定元素
srem key
- 例3:删除键
a3
的集合中元素wangwu
srem a3 wangwu
zset类型
- sorted set,有序集合
- 元素为string类型
- 元素具有唯⼀性,不重复
- 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
- 说明:没有修改操作
增加
- 添加
zadd key score1 member1 score2 member2 …
- 例1:向键
a4
的集合中添加元素lisi
、wangwu
、zhaoliu
、zhangsan
,权重分别为4、5、6、3
zadd a4 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan
- 返回指定范围内的元素
- start、stop为元素的下标索引
- 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示从尾部开始计数,如
-1
表示最后⼀个元素
zrange key start stop
- 例2:键
a4
的集合中所有元素
zrange a4 0 -1
- 返回
score
值在min
和max
之间的成员
zrangebyscore key min max
- 例3:键
a4
的集合中权限值在5和6之间
的成员
zrangebyscore a4 5 6
- 返回成员
member
的score
值
zscore key member
- 例4:键
a4
的集合中元素zhangsan
的权重
zscore a4 zhangsan
删除
- 删除指定元素
zrem key member1 member2 …
- 例5:删除集合
a4
中元素zhangsan
zrem a4 zhangsan
- 删除权重在指定范围的元素
zremrangebyscore key min max
- 例6:删除集合
a4
中权限在5、6之间
的元素
zremrangebyscore a4 5 6
安装包
安装Redis的有3种方式https://github.com/andymccurdy/redis-py
- 第一种:进⼊虚拟环境,联⽹安装包redis
pip install redis
- 第二种:进⼊虚拟环境,联⽹安装包redis
easy_install redis
- 第三种:到中⽂官⽹-客户端下载redis包的源码,使⽤源码安装
一步步执行 wget https://github.com/andymccurdy/redis-py/archive/master.zip
unzip master.zip
cd redis-py-master
sudo python setup.py install
调⽤模块
- 引⼊模块
from redis import StrictRedis
- 这个模块中提供了
StrictRedis对象
,⽤于连接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
- append
- get
- mget
- key
keys
- exists
- type
- delete
- expire
- getrange
- ttl
hash
- hset
- hmset
- hkeys
- hget
- hmget
- hvals
- hdel
list
- lpush
- rpush
- linsert
- lrange
- lset
- lrem
set
- sadd
- smembers
- srem
zset
- zadd
- zrange
- zrangebyscore
- zscore
- zrem
- zremrangebyscore
学习目标
- 能够使用StrictRedis对象对string类型数据进行增删改查
准备
- 在桌面上创建redis目录
- 使用pycharm打开 redis目录
- 创建redis_string.py文件
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
except Exception as e:
print(e)
string-增加
- ⽅法set,添加键、值,如果添加成功则返回True,如果添加失败则返回False
- 编写代码如下
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#添加键name,值为itheima
result=sr.set('name','itheima')
#输出响应结果,如果添加成功则返回True,否则返回False
print(result)
except Exception as e:
print(e)
string-
- ⽅法get,添加键对应的值,如果键存在则返回对应的值,如果键不存在则返回None
- 编写代码如下
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#键name的值
result = sr.get('name')
#输出键的值,如果键不存在则返回None
print(result)
except Exception as e:
print(e)
string-修改
- ⽅法set,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
- 编写代码如下
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#设置键name的值,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
result = sr.set('name','itcast')
#输出响应结果,如果操作成功则返回True,否则返回False
print(result)
except Exception as e:
print(e)
string-删除
- ⽅法delete,删除键及对应的值,如果删除成功则返回受影响的键数,否则则返 回0
- 编写代码如下
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#设置键name的值,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
result = sr.delete('name')
#输出响应结果,如果删除成功则返回受影响的键数,否则则返回0
print(result)
except Exception as e:
print(e)
键
- ⽅法keys,根据正则表达式键
- 编写代码如下
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#所有的键
result=sr.keys()
#输出响应结果,所有的键构成⼀个列表,如果没有键则返回空列表
print(result)
except Exception as e:
print(e)
学习目标
- 能够根据课件中的步骤搭建 Redis 的主从
主从概念
- ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构
- master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1
- 通过主从配置可以实现读写分离
- master和slave都是一个redis实例(redis服务)
主从配置
配置主
- 查看当前主机的ip地址
ifconfig
- 修改
/etc/redis/redis.conf
文件
sudo vi redis.conf
bind 192.168.26.128
- 重启redis服务
sudo service redis stop
sudo redis-server redis.conf
配置从
- 复制
/etc/redis/redis.conf
文件
sudo cp redis.conf ./slave.conf
- 修改
redis/slave.conf
文件
sudo vi slave.conf
- 编辑内容
bind 192.168.26.128
slaveof 192.168.26.128 6379
port 6378
- redis服务
sudo redis-server slave.conf
- 查看主从关系
redis-cli -h 192.168.26.128 info Replication
数据操作
- 在master和slave分别执⾏info命令,查看输出信息 进入主客户端
redis-cli -h 192.168.26.128 -p 6379
- 进入从的客户端
redis-cli -h 192.168.26.128 -p 6378
- 在master上写数据
set aa aa
- 在slave上读数据
get aa
为什么要有集群
- 之前我们已经讲了主从的概念,一主可以多从,如果同时的访问量过大(1000w),主服务肯定就会挂掉,数据服务就挂掉了或者发生自然灾难
- 大公司都会有很多的服务器(华东地区、华南地区、华中地区、华北地区、西北地区、西南地区、东北地区、台港澳地区机房)
集群的概念
- 集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。
当请求到来首先由负载均衡服务器处理,把请求转发到另外的一台服务器上。
redis集群
-
分类
- 软件层面
- 硬件层面
-
软件层面:只有一台电脑,在这一台电脑上启动了多个redis服务。
- 硬件层面:存在多台实体的电脑,每台电脑上都启动了一个redis或者多个redis服务。
搭建集群
- 当前拥有两台主机172.16.179.130、172.16.179.131,这⾥的IP在使⽤时要改为实际值
参考阅读
- redis集群搭建 http://www.cnblogs.com/wuxl360/p/5920330.html
- [Python]搭建redis集群 http://blog.5ibc.net/p/51020.html
配置机器1
- 在演示中,172.16.179.130为当前ubuntu机器的ip
- 在172.16.179.130上进⼊Desktop⽬录,创建conf⽬录
- 在conf⽬录下创建⽂件7000.conf,编辑内容如下
port 7000
bind 172.16.179.130
daemonize yes
pidfile 7000.pid
cluster-enabled yes
cluster-config-file 7000_node.conf
cluster-node-timeout 15000
appendonly yes
- 在conf⽬录下创建⽂件7001.conf,编辑内容如下
port 7001
bind 172.16.179.130
daemonize yes
pidfile 7001.pid
cluster-enabled yes
cluster-config-file 7001_node.conf
cluster-node-timeout 15000
appendonly yes
- 在conf⽬录下创建⽂件7002.conf,编辑内容如下
port 7002
bind 172.16.179.130
daemonize yes
pidfile 7002.pid
cluster-enabled yes
cluster-config-file 7002_node.conf
cluster-node-timeout 15000
appendonly yes
-
总结:三个⽂件的配置区别在port、pidfile、cluster-config-file三项
-
使⽤配置⽂件启动redis服务
redis-server 7000.conf
redis-server 7001.conf
redis-server 7002.conf
- 查看进程如下图
配置机器2
- 在演示中,172.16.179.131为当前ubuntu机器的ip
- 在172.16.179.131上进⼊Desktop⽬录,创建conf⽬录
- 在conf⽬录下创建⽂件7003.conf,编辑内容如下
port 7003
bind 172.16.179.131
daemonize yes
pidfile 7003.pid
cluster-enabled yes
cluster-config-file 7003_node.conf
cluster-node-timeout 15000
appendonly yes
- 在conf⽬录下创建⽂件7004.conf,编辑内容如下
port 7004
bind 172.16.179.131
daemonize yes
pidfile 7004.pid
cluster-enabled yes
cluster-config-file 7004_node.conf
cluster-node-timeout 15000
appendonly yes
- 在conf⽬录下创建⽂件7005.conf,编辑内容如下
port 7005
bind 172.16.179.131
daemonize yes
pidfile 7005.pid
cluster-enabled yes
cluster-config-file 7005_node.conf
cluster-node-timeout 15000
appendonly yes
-
总结:三个⽂件的配置区别在port、pidfile、cluster-config-file三项
-
使⽤配置⽂件启动redis服务
redis-server 7003.conf
redis-server 7004.conf
redis-server 7005.conf
- 查看进程如下图