Redis 与其他 key - value 缓存产品有以下三个特点:
VMware 上安装 Redis:
step1:下载
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
step2:解压
tar xzf redis-4.0.9.tar.gz
step3:移动,放到usr/local目录下
sudo mv ./redis-4.0.9 /usr/local/redis/
step4:进入redis目录
cd /usr/local/redis/
step5:生成
sudo make
注意:执行sudo make之前,确认下 /usr/local/redis目录下的文件是否是下图所示:
只有有上述的红框文件,才能执行make成功
step6:测试,这段运行时间会较长
sudo make test
step7:安装,将redis的命令安装到/usr/local/bin/目录
sudo make install
step8:安装完成后,我们进入目录/usr/local/bin中查看
cd /usr/local/bin
ls -all
- redis-server redis服务器
- redis-cli redis命令行客户端
- redis-benchmark redis性能测试工具
- redis-check-aof AOF文件修复工具
- redis-check-rdb RDB文件检索工具
step9:配置文件,移动到/etc/目录下
配置文件目录为/usr/local/redis/redis.conf
sudo cp /usr/local/redis/redis.conf /etc/redis/
Mac 上安装 Redis:
https://brew.sh/
https://www.cnblogs.com/cloudshadow/p/mac_brew_install_redis.html
Redis的配置信息在/etc/redis/redis.conf下。
查看
sudo vim /etc/redis/redis.conf
bind 127.0.0.1
port 6379
是否以守护进程运行
daemonize yes
数据文件
dbfilename dump.rdb
dir /var/lib/redis
千万注意:这个redis文件夹默认是没有的,需要自己创建
logfile "/var/log/redis/redis-server.log"
千万注意:这个redis文件夹默认是没有的,需要自己创建
database 16
redis 默认给咱们创建了16个数据库,数据库的编号(名字)是0-15
slaveof
redis配置信息http://blog.csdn.net/ljphilp/article/details/52934933
服务器端的命令为redis-server
可以使用help查看帮助⽂档
redis-server --help
ps aux | grep redis 查看redis服务器进程
sudo kill -9 pid 杀死redis服务器
sudo redis-server /etc/redis/redis.conf 指定加载的配置文件
redis-cli --help
连接redis
redis-cli
运行测试命令
ping
切换数据库
数据库没有名称,默认有16个,通过0-15来标识,连接redis默认选择第一个数据库
select 10
注意:键不能重复
值的类型分为五种:
数据操作行为:
点击中文官网查看命令文档http://redis.cn/commands.html
如果设置的键不存在则为添加,如果设置的键已经存在则修改
设置键值
set key value
例1:设置键为name值为itcast的数据
set name apollo
设置键值及过期时间,以秒为单位
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'
获取:根据键获取值,如果不存在此键则返回nil(不会报错)
get key
例5:获取键'name'的值
get 'name'
根据多个键获取多个值
mget key1 key2 ...
例6:获取键a1、a2、a3'的值
mget a1 a2 a3
详见下节键的操作,删除键时会将值删除
查找键,参数支持正则表达式
keys pattern
例1:查看所有键
keys *
例2:查看名称中包含a的键
keys a*
判断键是否存在,如果存在返回1,不存在返回0
exists key
例3:判断键a1是否存在
exists aa
查看键对应的value的类型
type key
例4:查看键a1的值类型,为redis⽀持的五种类型中的⼀种
type aa
删除键及对应的值
del key1 key2 ...
例5:删除键aa、a1
del aa a1
设置过期时间,以秒为单位,如果没有指定过期时间则一直存在,直到使用DEL移除
expire key seconds
例6:设置键'a1'的过期时间为3秒
expire 'a1' 3
查看有效时间,以秒为单位
ttl key
例7:查看键'bb'的有效时间
ttl bb
MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用
原因:
强制关闭Redis快照导致不能持久化。
解决方案:
- 运行config set stop-writes-on-bgsave-error no 命令后,关闭配置项stop-writes-on-bgsave-error解决该问题。
设置多个属性
hmset key field1 value1 field2 value2 ...
例2:设置键u2的属性name为itcast、属性age为11
hmset 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
hdel key field1 field2 ...
例7:删除键'u2'的属性'age'
hdel u2 age
在左侧插入数据
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
返回列表中指定范围内的元素
lrange key start stop
例4:获取键为'a1'的列表所有元素
lrange a1 0 -1
索引可以是负数,表示尾部开始计数,如-1表示最后一个元素
lset key index value
例5:修改键为'a1'的列表中下标为1的元素值为'z'
lset a 1 z
删除指定元素
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:查看列表'py12'的所有元素
lrange a2 0 -1
添加元素
sadd key member1 member2 ...
例1:向键'a3'的集合中添加元素'zhangsan'、'lisi'、'wangwu'
sadd a3 zhangsan sili wangwu
返回所有的元素
smembers key
例2:获取键'a3'的集合中所有元素
smembers a3
删除指定元素
srem key
添加
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
索引可以是负数,表示从尾部开始计数,如-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
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 *
sr = StrictRedis(host='localhost', port=6379, db=0)
# 简写
sr=StrictRedis()
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建立连接
sr=StrictRedis()
except Exception as e:
print(e)
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)
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)
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)
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)
通过主从配置可以实现读写分离
master和slave都是一个redis实例(redis服务)
查看当前主机的ip地址
ifconfig
修改etc/redis/redis.conf文件
sudo vim 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
在slave上读数据
get aa
当请求到来首先由负载均衡服务器处理,把请求转发到另外的一台服务器上。
参考阅读:
在conf目录下创建文件7000.conf,编辑内容如下
port 7000
bind 127.0.0.1
daemonize yes
pidfile 7000.pid
cluster-enabled yes
cluster-config-file 7000_node.conf
cluster-node-timeout 15000
appendonly yes
复制六份,分别命名为:7000.conf、7001.conf、7002.conf、7003.conf、7004.conf、7005.conf
把内容中所有的“7000”改为文件名对应的“7001、7002、7003、7004、7005”
即:六个文件的配置区别在port、pidfile、cluster-config-file三项
使用配置文件启动redis服务
redis-server 7000.conf
redis-server 7001.conf
redis-server 7002.conf
redis-server 7003.conf
redis-server 7004.conf
redis-server 7005.conf
查看进程如下图
将命令复制,这样可以在任何目录下调用此命令
sudo cp/usr/local/redis/src/redis-trib.rb /usr/local/bin/
安装ruby环境,因为redis-trib.rb是用ruby开发的
sudo apt-get install ruby
在提示信息处输入y,然后继续安装
运行如下命令创建集群
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
执行上述这个指令在某些机器上可能会报错,主要原因是由于安装的 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 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
提示如下主从信息,输入yes后:
提示完成,集群搭建成功
在127.0.0.1机器上连接7002,加参数-c表示连接到集群
redis-cli -h 127.0.0.1 -c -p 7002
写入数据
set name itheima
自动跳到了7001服务器,并写入数据成功
安装包如下
pip install redis-py-cluster
redis-py-cluster源码地址https://github.com/Grokzen/redis-py-cluster
创建文件redis_cluster.py,示例码如下
from rediscluster import *
if __name__ == '__main__':
try:
# 构建所有的节点,Redis会使用CRC16算法,将键和值写到某个节点上
startup_nodes = [
{'host': '127.0.0.1', 'port': '7000'},
{'host': '127.0.0.1', 'port': '7001'},
{'host': '127.0.0.1', 'port': '7002'},
{'host': '127.0.0.1', 'port': '7003'},
{'host': '127.0.0.1', 'port': '7004'},
{'host': '127.0.0.1', 'port': '7005'}
]
# 构建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)