NoSQL:一类新出现的数据库(not only sql),它的特点:
NoSQL中的产品种类相当多:
NoSQL和SQL数据库的比较:
两者在不断地取长补短,呈现融合趋势
Redis中文官网
以3.2.8版本为例
step1:下载
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
tar -zxvf redis-3.2.8.tar.gz
step3:复制,放到usr/local⽬录下
sudo mv ./redis-3.2.8 /usr/local/redis/
step4:进⼊redis⽬录
cd /usr/local/redis/
step5:生成
sudo make
step6:测试,这段运⾏时间会较⻓
sudo make test
step7:安装,将redis的命令安装到/usr/local/bin/⽬录
sudo make install
step8:安装完成后,进入目录/usr/local/bin中查看
cd /usr/local/bin
ls -all
step9:配置⽂件,移动到/etc/⽬录下
配置⽂件⽬录为/usr/local/redis/redis.conf
sudo cp /usr/local/redis/redis.conf /etc/redis/
Redis的配置信息在/etc/redis/redis.conf下。
查看
sudo vi /etc/redis/redis.conf
绑定ip:如果需要远程访问,可将此⾏注释,或绑定⼀个真实ip
bind 127.0.0.1
端⼝,默认为6379
port 6379
是否以守护进程运⾏
数据⽂件
dbfilename dump.rdb
数据⽂件存储路径
dir /var/lib/redis
⽇志⽂件
logfile /var/log/redis/redis-server.log
数据库,默认有16个
database 16
主从复制,类似于双机备份。
slaveof
django-redis-session配置
服务器端的命令为redis-server
使⽤help查看帮助⽂档
redis-server --help
推荐使⽤服务的⽅式管理redis服务
启动
sudo service redis start
停⽌
sudo service redis stop
重启
sudo service redis restart
个人习惯
ps -ef|grep redis 查看redis服务器进程
sudo kill -9 pid 杀死redis服务器
sudo redis-server /etc/redis/redis.conf 指定加载的配置文件
客户端的命令为redis-cli
使⽤help查看帮助⽂档
redis-cli --help
连接redis
redis-cli
运⾏测试命令
ping
切换数据库
redis数据库没有名称,默认有16个,通过0-15来标识,连接redis默认选择第一个数据库
select n
redis是key-value的数据结构,每条数据都是⼀个键值对
键的类型是字符串
注意:键不能重复
值的类型分为五种:
保存、修改、获取、删除
Redis客户端命令
字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
如果设置的键不存在则为添加,如果设置的键已经存在则修改
set key value
例1:设置键为name值为itcast的数据set name itcast
setex key seconds value
例2:设置键为aa值为aa过期时间为3秒的数据setex aa 3 aa
mset key1 value1 key2 value2 ...
例3:设置键为’a1’值为’python’、键为’a2’值为’java’、键为’a3’值为’c’mset a1 python a2 java a3 c
append key value
例4:向键为a1中追加值’ haha’append 'a1' 'haha'
get key
例5:获取键’name’的值get 'name'
mget key1 key2 ...
例6:获取键a1、a2、a3’的值mget a1 a2 a3
del key1 key2 ...
keys pattern
例1:查看所有键keys *
keys 'a*'
exists key1
例3:判断键a1是否存在exists a1
type key
例4:查看键a1的值类型,为redis⽀持的五种类型中的⼀种type a1
del key1 key2 ...
例5:删除键a2、a3del a2 a3
expire key seconds
例6:设置键’a1’的过期时间为3秒expire 'a1' 3
ttl key
例7:查看键’bb’的有效时间ttl bb
hash⽤于存储对象,对象的结构为属性、值
值的类型为string
hset key field value
例1:设置键 user的属性name为itheimahset user name itheima
hmset key field1 value1 field2 value2 ...
例2:设置键u2的属性name为itcast、属性age为11hmset u2 name itcast age 11
hkeys key
例3:获取键u2的所有属性hkeys u2
hget key field
例4:获取键u2属性’name’的值hget u2 'name'
hmget key field1 field2 ...
例5:获取键u2属性’name’、'age的值hmget u2 name age
hvals key
例6:获取键’u2’所有属性的值hvals u2
列表的元素类型为string
按照插⼊顺序排序
lpush key value1 value2 ...
例1:从键为’a1’的列表左侧加⼊数据a 、 b 、clpush a1 a b c
rpush key value1 value2 ...
例2:从键为’a1’的列表右侧加⼊数据0 1rpush a1 0 1
linsert key before或after 现有元素 新元素
例3:在键为’a1’的列表中元素’b’前加⼊’3’linsert a1 before b 3
lrange key start stop
例4:获取键为’a1’的列表所有元素lrange a1 0 -1
索引从左侧开始,第⼀个元素为0
索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素
lset key index value
例5:修改键为’a1’的列表中下标为1的元素值为’z’
lset a 1 z
删除指定元素
lrem key count value
向列表’a2’中加⼊元素’a’、‘b’、‘a’、‘b’、‘a’、‘b’
lpush a2 a b a b a b
lrem a2 -2 b
查看列表’a2’的所有元素
lrange a2 0 -1
⽆序集合
元素为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
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
zrange key start stop
例2:获取键’a4’的集合中所有元素zrange a4 0 -1
zrangebyscore key min max
例3:获取键’a4’的集合中权限值在5和6之间的成员zrangebyscore a4 5 6
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种方式
传送门
pip install redis
easy_install 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对象(Strict严格),⽤于连接redis服务器,并按照不同类型提供 了不同⽅法,进⾏交互操作
通过init创建对象,指定参数host、port与指定的服务器和端⼝连接,host默认为localhost,port默认为6379,db默认为0
sr = StrictRedis(host='localhost', port=6379, db=0)
简写
sr=StrictRedis()
根据不同的类型,拥有不同的实例⽅法可以调⽤,与前⾯学的redis命令对应,⽅法需要的参数与命令的参数⼀致
from redis import *
if __name__=='__main__':
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr = StrictRedis()
except Exception as e:
print(e)
⽅法set,添加键、值,如果添加成功则返回True,如果添加失败则返回False
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#添加键name,值为abc
result=sr.set('name','abc')
#输出响应结果,如果添加成功则返回True,否则返回False
print(result)
except Exception as e:
print(e)
⽅法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)
⽅法set,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#设置键name的值,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
result = sr.set('name','abc')
#输出响应结果,如果操作成功则返回True,否则返回False
print(result)
except Exception as e:
print(e)
⽅法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)
django的session默认是存在的数据库里面的,也可以把session存储在redis里面
创建django项目和booktest应用,并配置url
安装包
pip install django-redis-sessions==0.5.6
修改settings文件,增加如下项
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 2
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'
测试
打开booktest/views.py文件,创建session_set和session_get视图如下
打开booktest/urls.py文件,配置url如下
通过redis-cli客户端查看
通过Base64在线解码解码内容获得键值
查看当前主机的ip地址
ifconfig
sudo vi redis.conf
bind 192.168.26.128
重启redis服务
sudo service redis stop
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
get aa
集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。
当请求到来首先由负载均衡服务器处理,把请求转发到另外的一台服务器上。
分类
软件层面:只有一台电脑,在这一台电脑上启动了多个redis服务。
硬件层面:存在多台实体的电脑,每台电脑上都启动了一个redis或者多个redis服务。
redis集群搭建
[Python]搭建redis集群
假设当前拥有两台主机172.16.179.130、172.16.179.131,实际使用时IP要改为实际值
在演示中,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
在演示中,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
使⽤配置⽂件启动redis服务
redis-server 7003.conf
redis-server 7004.conf
redis-server 7005.conf
redis的安装包中包含了redis-trib.rb,⽤于创建集群
接下来的操作在172.16.179.130机器上进⾏
将命令复制,这样可以在任何⽬录下调⽤此命令
sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/
安装ruby环境,因为redis-trib.rb是⽤ruby开发的
sudo apt-get install ruby
redis-trib.rb create --replicas 1 172.16.179.130:7000 172.16.179.130:7001 172.16.179.130:7002 172.16.179.131:7003 172.16.179.1
执⾏上⾯这个指令在某些机器上可能会报错,主要原因是由于安装的 ruby 不是最 新版本
由于防⽕墙导致⽆法下载最新版本,所以需要设置 gem 的源
解决办法如下
-- 先查看⾃⼰的 gem 源是什么地址
gem source -l -- 如果是https://rubygems.org/ 就需要更换
-- 更换指令为
gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
-- 通过 gem 安装 redis 的相关依赖
sudo gem install redis
-- 然后重新执⾏指令
redis-trib.rb create --replicas 1 172.16.179.130:7000 172.16.179.130:7001 172.16.179.130:7002 172.16.179.131:7003 172.16.179.131:7004 172.16.179.131:7005
提示如下主从信息,输⼊yes后回⻋
根据上图可以看出,当前搭建的主服务器为7000、7001、7003,对应的从服务器是7004、7005、7002
在172.16.179.131机器上连接7002,加参数-c表示连接到集群
redis-cli -h 172.16.179.131 -c -p 7002
写⼊数据
set name itheima
⾃动跳到了7003服务器,并写⼊数据成功
在7003可以获取数据,如果写入数据又重定向到7000(负载均衡)
安装包
pip install redis-py-cluster
redis-py-cluster源码地址
创建⽂件redis_cluster.py,示例码如下
from rediscluster import *
if __name__ == '__main__':
try:
# 构建所有的节点,Redis会使⽤CRC16算法,将键和值写到某个节点上
startup_nodes = [
{'host': '192.168.26.128', 'port': '7000'},
{'host': '192.168.26.130', 'port': '7003'},
{'host': '192.168.26.128', 'port': '7001'},
]
# 构建StrictRedisCluster对象
src=StrictRedisCluster(startup_nodes=startup_nodes,decode_responses=True)
# 设置键为name、值为itheima的数据
result=src.set('name','itheima')
print(result)
# 获取键为name
name = src.get('name')
print(name)
except Exception as e:
print(e)