
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
 
- 查看进程如下图 

 














](https://img-blog.csdnimg.cn/img_convert/cfb68c87c97daaecc89dda2a9d3cfcc9.png)




