拓展阅读:NoSQL
拓展阅读:NoSQL数据库的四大分
拓展阅读:NoSQL数据库使用场景
拓展阅读:Redis官方网站
拓展阅读:Redis中文官网
拓展阅读:Redis官方下载地址
拓展阅读:redis官方教程
sudo snap install redis-desktop-manager
Redis 版本号采用标准惯例:主版本号.副版本号.补丁级别,一个副版本号就标记为一个标准发行版本,例如 1.2,2.0,2.2,2.4,2.6,2.8,奇数的副版本号用来表示非标准版本,例如2.9.x发行版本是Redis 3.0标准版本的非标准发行版本。
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
[图片上传失败...(image-838616-1538030921398)]
tar xzf redis-4.0.11.tar.gz
[图片上传失败...(image-d2c930-1538030921398)]
mv ./redis-4.0.11/* /usr/local/redis/
cd /usr/local/redis/
sudo make
sudo make test
sudo make install
cd /usr/local/bin
ls -all
redis-server redis服务器
redis-cli redis命令行客户端
redis-benchmark redis性能测试工具
redis-check-aof AOF文件修复工具
redis-check-rdb RDB文件检索工具
配置文件目录为/usr/local/redis/redis.conf
sudo cp /usr/local/redis/redis.conf /etc/redis/
sudo vi /etc/redis/redis.conf
bind 127.0.0.1
端⼝,默认为6379
是否以守护进程运行
推荐设置为yes
数据文件
dbfilename dump.rdb
dir /var/lib/redis
注意: /var/lib/redis 目录下面没有redis文件夹,需要我们手动创建
logfile /var/log/redis/redis-server.log
database 16
slaveof
redis配置信息
服务端的命令为redis-server
可以使用help查看帮助文档
redis-server --help
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
redis-cli -h 192.168.31.166 -p 6379
切换数据库
数据库没有名称,默认16个,通过0-15来标识,链接redis默认选择第一个数据库
select n
Redis有5个基本数据结构,string、list、hash、set和zset。 它们是日常开发中使用频率非常高应用最为广泛的数据结构,把这5个数据结构都吃透了,你就掌握了Redis应用知识的一半了。
点击中文官方查看命令文档
字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
如果设置的键不存在则为添加,如果设置的键已经存在则修改
语法 | 说明 | 举例 |
---|---|---|
set key value | 设置键值 | set name 100cxy |
set key seconds value | 设置键值以及过期时间,时间以秒为单位 | setex k1 3 100cxy |
mset key1 value1 key2 value2 ... | 设置多个键值 | mset k1 html k2 css k3 javascrip |
append key value | 追加值 | append 'k1' 'html5' |
语法 | 说明 | 举例 |
---|---|---|
get key | 根据键获取值,如果不存在此键返回nil | get name |
mget key1 key2 ... | 根据多个键获取多个值 | mget k1 k2 k3 |
拓展阅读:value汉字显示问题
语法 | 说明 | 举例 |
---|---|---|
keys pattern | 查找键,参数支持正则表达式 | 1、keys * 2、 keys 'k*' |
exists key | 判断键是否存在,如果存在返回1,不存在返回0 | exists k1 |
type key | 查看键对应的value的类型 | type k1 |
del key1 key2... | 删除键对应的值 | del k1 k2 |
expire key seconds | 设置过期时间,以秒为单位,如果没有指定过期时间则一直存在,直到使用DEL移除 | expire k1 3 |
ttl key | 查看有效时间,以秒为单位 当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。 |
ttl name |
语法 | 说明 | 举例 |
---|---|---|
hset key field value | 设置单个属性 | hset user name 100cxy |
hmset key field1 value1 field2 value2 | 设置多个属性 | hmset user2 name 100cxy age 100 |
语法 | 说明 | 举例 |
---|---|---|
hkeys key | 获取指定键所有的属性 | hkeys user2 |
hget key field | 获取一个属性的值 | hget user2 name |
hmget key field1 field2 .... | 获取多个属性的值 | hmget user2 name age |
hvals key | 取所有属性的值 | hvals user2 |
语法 | 说明 | 举例 |
---|---|---|
hdel key field1 field2 ... | 删除属性,属性对应的值会被⼀起删除 说明: 删除整个hash键及值,使⽤del命令 |
hdel user2 age |
语法 | 说明 | 举例 |
---|---|---|
lpush key value1 value2 ... | 在左侧插⼊数据 | lpush k1 java python go |
rpush key value1 value2 ... | 在右侧插⼊数据 | rpush k1 html css js |
linsert key before|after piovt value | 在指定元素的前或后插⼊新元素 | linsert k1 before java php |
返回列表⾥指定范围内的元素
语法
lrange key start stop
lset key index value
删除指定元素
语法
lrem key count value
-- 向k4列表中添加a b a b a b
lpush k4 a b a b a b
-- 从列表右侧开始删除2个b
lrem k4 -2 b
-- 查看列表中所有元素
lrange k4 0 -1
语法 | 说明 | 举例 |
---|---|---|
sadd key member1 member2 ... | 添加元素 | sadd k1 'zhangsan' 'lisi' 'wangwu' |
语法 | 说明 | 举例 |
---|---|---|
smembers key | 返回所有的元素 | smembers k1 |
语法 | 说明 | 举例 |
---|---|---|
srem key | 删除指定元素 | srem k1 wangwu |
语法 | 说明 | 举例 |
---|---|---|
zadd key score1 member1 score2 member2 | 添加 | zadd k1 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan |
语法 | 说明 | 举例 |
---|---|---|
zrange key start stop | 返回指定范围内的元素 start、stop为元素的下标索引 索引从左侧开始,第⼀个元素为0 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素 |
zrange k1 0 -1 |
zrangebyscore key min max | 返回score值在min和max之间的成员 | zrangebyscore k1 5 6 |
zscore key member | 返回成员member的score值 | zscore k1 zhangsan |
语法 | 说明 | 举例 |
---|---|---|
zrem key member1 member2 ... | 删除指定元素 | zrem k1 zhangsan |
zremrangebyscore key min max | 删除权重在指定范围的元素 | zremrangebyscore k1 5 6 |
安装Redis的有3种方式
方式 | 代码 |
---|---|
pip包管理工具 | pip install redis |
easy_install | 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对象,⽤于连接redis服务器,并按照不同类型提供了不同⽅法,进⾏交互操作
"""
sr = StrictRedis(host='localhost', port=6379, db=0)
简写
sr=StrictRedis()
# -*- coding: utf-8 -*-
# @Time : 18-9-24 下午6:34
# @Author : wengwenyu
# @Email : [email protected]
# @File : demo.py
# @Software: PyCharm
from redis import *
if __name__ == '__main__':
try:
# 创建StrictRedis对象,与redis服务器建立连接
sr = StrictRedis()
except Exception as e:
print(e)
redis中的String在内存中按照一个name对应一个value来存储的
set(name,value,ex=None,px=None,nx=False,xx=False)
from redis import *
if __name__=="__main__":
try:
# 创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#添加键name,值为100cxy
result=sr.set('name','100cxy')
#输出响应结果,如果添加成功则返回True,否则返回False
print(result)
except Exception as e:
print(e)
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)
拓展阅读:redis的value值为汉字解决方案
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#设置键name的值,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
result = sr.set('name','cxy100')
#输出响应结果,如果操作成功则返回True,否则返回False
print(result)
except Exception as e:
print(e)
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)
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#获取所有的键
result=sr.keys()
#输出响应结果,所有的键构成⼀个列表,如果没有键则返回空列表
print(result)
except Exception as e:
print(e)
方法 | 说明 | 举例 |
---|---|---|
setnx(name,value) | 设置值,只有name不存在时,执行设置(添加)操作 | r = sr.setnx('name','张三') 第一次设置时,键name不存在,r为bool值,返回true,当第二次运行这段代码因为key已经存在,所以r返回false |
mset(args,*kwargs) | 批量设置值 | r = sr.mset(n1='张三', n2='李四') |
get(name) | 获取值 | sr.get('n1') |
getrange(key,start,end) | 获取字节序列(非字符),前面我们修改汉字问题的时候一般不是字节序列而是字符序列 | sr.getrange('n1',0,1) |
setrange(name,offset,value) | 修改字符串内容,从指定字符串索引开始向后替换(新值太长,则向后添加) | sr.setrange(name,0,'python') |
strlen(name) | 返回name对应值的字节长度(一个汉字3个字节) | sr.strlen('name') |
# -*- coding: utf-8 -*-
# @Time : 18-9-25 下午8:11
# @Author : wengwenyu
# @Email : [email protected]
# @File : 连接redis.py
# @Software: PyCharm
from redis import *
if __name__ == '__main__':
try:
# 创建strictRedis对象,与redis服务器建立连接
sr = StrictRedis(decode_responses=True)
# hset(self, name, key, value)
# 当name对应的hash中不存在当前key时则创建(相当于添加)
sr.hset('h1', 'name', '张三')
# 获取
print(sr.hget('h1', 'name'))
except Exception as e:
print(e)
# -*- coding: utf-8 -*-
# @Time : 18-9-25 下午8:11
# @Author : wengwenyu
# @Email : [email protected]
# @File : 连接redis.py
# @Software: PyCharm
from redis import *
if __name__ == '__main__':
try:
# 创建strictRedis对象,与redis服务器建立连接
sr = StrictRedis(decode_responses=True)
sr.hmset('h2', {'name': '李四', 'age': 20})
print(sr.hmget('h2', 'name', 'age'))
except Exception as e:
print(e)
# -*- coding: utf-8 -*-
# @Time : 18-9-25 下午8:11
# @Author : wengwenyu
# @Email : [email protected]
# @File : 连接redis.py
# @Software: PyCharm
from redis import *
if __name__ == '__main__':
try:
# 创建strictRedis对象,与redis服务器建立连接
sr = StrictRedis(decode_responses=True)
print(sr.hgetall('h2'))
except Exception as e:
print(e)
# -*- coding: utf-8 -*-
# @Time : 18-9-25 下午8:11
# @Author : wengwenyu
# @Email : [email protected]
# @File : 连接redis.py
# @Software: PyCharm
from redis import *
if __name__ == '__main__':
try:
# 创建strictRedis对象,与redis服务器建立连接
sr = StrictRedis(decode_responses=True)
sr.hdel('h2', 'name')
except Exception as e:
print(e)
方法 | 说明 | 举例 |
---|---|---|
hkeys(name) | 获取name对应的hash中所有的key的值 | sr.hkeys('h2') |
hvals(name) | 获取name对应的hash中所有的value值 | sr.hvals('h2') |
hlen(name) | 获取name对应的hash中键值对的个数 | sr.hlen('h2') |
拓展阅读:七个小矮人的名字
# -*- coding: utf-8 -*-
# @Time : 18-9-25 下午8:11
# @Author : wengwenyu
# @Email : [email protected]
# @File : 连接redis.py
# @Software: PyCharm
from redis import *
if __name__ == '__main__':
try:
# 创建strictRedis对象,与redis服务器建立连接
sr = StrictRedis(decode_responses=True)
# 7个小矮人的英文名
# lpush(name,values) 在name对应的list中添加元素,每个新的元素都添加到列表的最左边
# 补充:rpush(name,values) ..........................................最右边
sr.lpush('xiao_ai_ren', 'Doc', 'Grumpy', 'Happy', 'Sleepy', 'Docpey', 'Bashful', 'Sneezy')
print(sr.lrange('xiao_ai_ren', 0, -1))
except Exception as e:
print(e)
from redis import *
if __name__ == '__main__':
try:
# 创建strictRedis对象,与redis服务器建立连接
sr = StrictRedis(decode_responses=True)
# 在Happy的前面插入cry 在Happy的后面插入 smile
sr.linsert('xiao_ai_ren', 'before', 'Happy', 'cry')
sr.linsert('xiao_ai_ren', 'after', 'Happy', 'smile')
print(sr.lrange('xiao_ai_ren', 0, -1))
except Exception as e:
print(e)
语法
lset(name,index,value) # 对name对应的list中的某一个索引位置重新赋值
参数说明
# -*- coding: utf-8 -*-
# @Time : 18-9-25 下午8:11
# @Author : wengwenyu
# @Email : [email protected]
# @File : 连接redis.py
# @Software: PyCharm
from redis import *
if __name__ == '__main__':
try:
# 创建strictRedis对象,与redis服务器建立连接
sr = StrictRedis(decode_responses=True)
print('修改前:{}'.format(sr.lrange('xiao_ai_ren', 0, -1)))
# 修改索引为4的值 为cry2
sr.lset('xiao_ai_ren', 4, 'cry2')
print('修改后:{}'.format(sr.lrange('xiao_ai_ren', 0, -1)))
except Exception as e:
print(e)
# -*- coding: utf-8 -*-
# @Time : 18-9-25 下午8:11
# @Author : wengwenyu
# @Email : [email protected]
# @File : 连接redis.py
# @Software: PyCharm
from redis import *
if __name__ == '__main__':
try:
# 创建strictRedis对象,与redis服务器建立连接
sr = StrictRedis(decode_responses=True)
print('删除前:{}'.format(sr.lrange('xiao_ai_ren', 0, -1)))
# 0表示删除列表中所有指定的值, 2表示从前往后删除(如果值存在)2个指定的值 -2表示从后往前
sr.lrem('xiao_ai_ren', 0, 'cry2')
print('删除后:{}'.format(sr.lrange('xiao_ai_ren', 0, -1)))
except Exception as e:
print(e)
# -*- coding: utf-8 -*-
# @Time : 18-9-25 下午8:11
# @Author : wengwenyu
# @Email : [email protected]
# @File : 连接redis.py
# @Software: PyCharm
from redis import *
if __name__ == '__main__':
try:
# 创建strictRedis对象,与redis服务器建立连接
sr = StrictRedis(decode_responses=True)
sr.sadd('name', 'zhangsan', 'zhangsan', 'lisi')
print(sr.smembers('name'))
except Exception as e:
print(e)
# -*- coding: utf-8 -*-
# @Time : 18-9-26 下午2:06
# @Author : wengwenyu
# @Email : [email protected]
# @File : 注册登录.py
# @Software: PyCharm
# 1. 注册----> 用户输入账号,密码(加密 md5 sha1 sha256..) ---> 存进mysql数据库(永久)
# 2. 登录-----> 用户输入账号密码 -----> redis(如果redis里面能找到 登录, 缓存,20)------> mysql ----> 先存到redis
# from hashlib import *
import hashlib
# 导入mysql的驱动
from pymysql import *
# 导入redis 驱动
from redis import *
# mysql的登录
def mysql_login(username, upwd):
# 第一步: 能到这里 说明 账号是找不到的 先找有没有这个账号 有 就提取密码做比较
# 没有就 直接说 没这个用户
try:
# 1. 创建Connection连接
conn = connect(host='localhost', port=3306, user='root', password='123456', database='D6', charset='utf8')
# 2. 获得Cursor对象
cs1 = conn.cursor()
# 3. 查询
r = cs1.execute('select upwd from users where uname="{}"'.format(username))
a = cs1.fetchone()
a = a[0]
print(a)
# 如果这个r里面有值 就说明是 用户存在 开始比较密码
# 如果这个r里面没有值 账号都不在
if r == None:
# 账号不在
print('请去注册')
else:
if upwd == a:
# 存 redis
sr = StrictRedis(decode_responses=True)
sr.set(username, upwd)
print('登录成功')
else:
print('密码错误')
except Exception as e:
print(e)
print('mysql的登录函数')
# redis的登录
def redis_login():
username = input('请输入用户名:')
password = input('请输入密码:')
# 对用户输入的密码 加密
s1 = hashlib.sha1()
s1.update(password.encode('utf8'))
# 得到加密以后的字符串
upwd = s1.hexdigest()
# 连接 redis
try:
# redis 的连接 默认ip 本地 和 默认端口 6379
sr = StrictRedis(decode_responses=True)
# 查?-----> 查? 用户名 对应的密码
# username 用户名
r = sr.get(username)
if r == None:
# 说明redis里面找不到 ---> 只能确定 redis里面没有
mysql_login(username, upwd)
else:
# upwd>? 是用户输入的 r是redis找出来的密码
if upwd == r:
print('登录成功')
else:
print('密码错误')
except Exception as e:
print(e)
print('redis的登录函数')
# mysql的注册
def register():
# 用户输入1的时候 注册 (往mysql里面填数据) 表到低有没有
# 1. 让用户 输入 账号 密码
username = input('请输入账号:')
password = input('请输入密码:')
# 2. 为密码加密
# 选择加密方式
s1 = hashlib.sha1()
# 添加加密内容
s1.update(password.encode('utf8'))
# upwd 就是加密以后的字符串 获取加密以后的字符串
upwd = s1.hexdigest()
print(username, upwd)
try:
# 1. 创建Connection连接
conn = connect(host='localhost', port=3306, user='root', password='123456', database='D6', charset='utf8')
# 2. 获得Cursor对象
cs1 = conn.cursor()
# 3. 执行sql语句
cs1.execute('insert into users values(0,"{}","{}")'.format(username, upwd))
# 4. commit
conn.commit()
except Exception as e:
print(e)
def main():
# 1. 用户输入 来确定执行什么功能
a = input('请选择是[1]注册还是[2]登录:')
# 2. 判断用户 输入的是1 还是2
if a == '1':
register()
elif a == '2':
# 一般登录的时候 先从redis里面找 找不到再去 mysql
redis_login()
else:
print('输入有误')
if __name__ == '__main__':
main()
数据备份
[图片上传失败...(image-46b7c6-1538030921400)]
读写分离
sudo vi /etc/redis/redis.conf
bind 192.168.31.166
sudo service redis stop
redis-server redis.conf
sudo cp redis.conf ./slave.conf
sudo vi slave.conf
bind 从服务器ip
slaveof 主服务器ip 主服务端口号
port 从服务器端口号
sudo redis-server slave.conf
redis-cli -h ip info Replication
redis-cli -h 192.168.31.166 -p 6379
redis-cli -h 192.168.31.166 -p 6378
set name 100cxy
get 100cxy
注意:当请求到来首先由负载均衡服务器处理,把请求转发到另外一台服务器上.
[图片上传失败...(image-18e0f7-1538030921401)]
[图片上传失败...(image-469764-1538030921401)]
当前拥有两台主机192.168.31.25、192.168.31.166,这⾥的IP在使⽤时要改为实际值
redis集群搭建
python搭建redis集群
port 7000
bind 192.168.31.166
daemonize yes
pidfile 7000.pid
cluster-enabled yes
cluster-config-file 7000_node.conf
cluster-node-timeout 15000
appendonly yes
port 7001
bind 192.168.31.166
daemonize yes
pidfile 7001.pid
cluster-enabled yes
cluster-config-file 7001_node.conf
cluster-node-timeout 15000
appendonly yes
port 7002
bind 192.168.31.166
daemonize yes
pidfile 7002.pid
cluster-enabled yes
cluster-config-file 7002_node.conf
cluster-node-timeout 15000
appendonly yes
redis-server 7000.conf
redis-server 7001.conf
redis-server 7002.conf
port 7003
bind 192.168.31.25
daemonize yes
pidfile 7003.pid
cluster-enabled yes
cluster-config-file 7003_node.conf
cluster-node-timeout 15000
appendonly yes
port 7004
bind 192.168.31.25
daemonize yes
pidfile 7004.pid
cluster-enabled yes
cluster-config-file 7004_node.conf
cluster-node-timeout 15000
appendonly yes
port 7005
bind 192.168.31.25
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
sudo apt install ruby
但是后续我们执⾏集群这个指令在某些机器上可能会报错,主要原因是由于安装的 ruby 不是最 新版本
天朝的防⽕墙导致⽆法下载最新版本,所以需要设置 gem 的源
解决办法如下:
-- 先查看⾃⼰的 gem 源是什么地址
gem source -l -- 如果是https://rubygems.org/ 就需要更换
-- 更换指令为
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
-- 通过 gem 安装 redis 的相关依赖
sudo gem install redis
-- 然后重新执⾏指令
redis-trib.rb create --replicas 1 192.168.31.166:7000 192.168.31.166:7001 192.168.31.166:7002 192.168.31.25:7003 192.168.31.25:7004 192.168.31.25:7005
sudo cp /usr/local/redis/src/redis-trib.rb /usr/local/bin/
redis cluster在设计的时候,就考虑到了去中⼼化,去中间件,也就是说,集群中 的每个节点都是平等的关系,都是对等的,每个节点都保存各⾃的数据和整个集 群的状态。每个节点都和其他所有节点连接,⽽且这些连接保持活跃,这样就保 证了我们只需要连接集群中的任意⼀个节点,就可以获取到其他节点的数据
Redis集群没有并使⽤传统的⼀致性哈希来分配数据,⽽是采⽤另外⼀种叫做哈希 槽 (hash slot)的⽅式来分配的。redis cluster 默认分配了 16384 个 slot,当我们 set⼀个key 时,会⽤CRC16算法来取模得到所属的slot,然后将这个key 分到哈 希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的 时候看到set 和 get 的时候,直接跳转到了7000端⼝的节点
Redis 集群会把数据存在⼀个 master 节点,然后在这个 master 和其对应的salve 之间进⾏数据同步。当读取数据时,也根据⼀致性哈希算法到对应的 master 节 点获取数据。 只有当⼀个master 挂掉之后,才会启动⼀个对应的 salve 节点,充 当 master
需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存 活的主节点数⼩于总节点数的⼀半时,整个集群就⽆法提供服务了
根据上图可以看出,当前搭建的主服务器为7000、7001、7003,对应的从服务器是7004、7005、7002
在192.168.31.166机器上连接7002,加参数-c表示连接到集群
redis-cli -h 192.168.31.166 -c -p 7002
set name 1000cxy
安装包如下
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.31.166', 'port': '7000'},
{'host': '192.168.31.25', 'port': '7003'},
{'host': '192.168.31.166', 'port': '7001'},
]
# 构建StrictRedisCluster对象
src=StrictRedisCluster(startup_nodes=startup_nodes,decode_responses=True)
# 设置键为name、值为100cxy的数据
result=src.set('name','100cxy')
print(result)
# 获取键为name
name = src.get('name')
print(name)
except Exception as e:
print(e)
如果公网ip开放着,6379端口也开放着,那别人就可以远程连接服务器,比如我在/root/.ssh/authorized_keys存放公钥秘钥文件里面存了自己的公钥,就能像超级管理员一样控制你的电脑,这就是redis漏洞,解决这个漏洞的方法很多,设置密码,监听内网ip,加防火墙都可以解决,还有就是以普通的用户身份启动.
bind 127.0.0.1//可以是多个ip,用空格分隔
port 16000 # 默认:6379
-- 在redis配置文件里面添加
requirepass 100cxy
-- 客户端登录
redis-cli -a 100cxy
-- 改名:在配置文件里面添加
rename-command CONFIG cxy
-- 禁用 空字符串
rename-command CONFIG ''
拓展阅读:关于redis的安全性
两种持久化的方式:快照(RDB文件)和追加式文件(AOF文件)
方式 | 说明 |
---|---|
RDB (Redis DataBase) |
简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上 |
AOF (Append Only File) |
相对于RDB而言换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次重启的时候,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了 |
说明: RDB和AOF两种方式也是可以同时使用,在这种情况下,如果redis重启的话,则有限采用AOF方式来进行数据恢复,这是因为 AOF方式恢复数据的完整度更高;如果你没有数据持久化的需求,也可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存的数据库,就像memcache一样.
点击: Redis持久化参考阅读