redis,
Redis
网址
redis官方,网址1:https://redis.io/
redis安装软件,下载网址2:http://download.redis.io/releases/
redis使用文档命令,网址3:http://doc.redisfans.com/
redis,windows下安装软件包,网址4:https://github.com/dmajkic/redis/downloads
额外快餐(参考)
wget命令,下载文件的其他理解,参考1:https://www.cnblogs.com/peida/archive/2013/03/18/2965369.html
configure命令,编译,安装,其他理解,参考2:https://www.cnblogs.com/tinywan/p/7230039.html
安装
Linux系统
# 下载安装包 (-c 断点续传,-b 后台下载)
wget -c http://download.redis.io/releases/redis-4.0.1.tar.gz
# 解压
tar -xvf redis-4.0.1.tar.gz
cd redis-4.0.1/
# 修改要安装的目录路径,并编译,并开启安装
./configure --prefix=/usr/local/redis401 && make && make install
# 这时候 Redis 程序已经被安装到
/usr/local/redis401/bin目录# 将配置文件移动到安装目录
mv redis.conf /usr/local/redis401/etc/redis.conf
# 启动Redis服务器(这里,用配置文件启动的Redis)
/usr/local/redis401/bin/redis-server /usr/local/redis401/etc/redis.conf
# 关闭Redis服务器
/usr/local/redis401/bin/redis-cli shutdown 或者 pkill redis-server
# 客户端,连接本机Redis服务器
/usr/local/redis401/bin/redis-cli
# 客户端,连接到指定主机Redis
/usr/local/redis401/bin/redis-cli -h 192.168.210.212 -p 6379
# 默认情况 Redis 不是在后台运行 , 如果需要把 Redis 放在后台运行 , 编辑配置文件
vim /usr/local/redis401/etc/redis.conf
# 将daemonize值改为yes
# 设置,Redis开机启动
vim /etc/rc.loacl # 加上:/usr/local/redis401/bin/redis-server /usr/local/redis401/etc/redis.conf
# /usr/local/redis401/bin/ 目录下,几个文件概述:
redis-benchmark : Redis 性能测试工具
redis-check-aof : 检查 aof 日志的工具
redis-check-dump : 检查 rdb 日志的工具
redis-cli : 连接用的客户端
redis-server : Redis 服务进程
Redis的配置项,redis.conf,解析:
daemonize : 如需要在后台运行 , 把该项的值改为 yes
pdifile : 把 pid 文件放在 /var/run/redis.pid , 可以配置到其他地址
bind : 指定 Redis 只接收来自该 IP 的请求 , 如果不设置 , 那么将处理所有请求 , 在生产环节中最好设置该项
port : 监听端口 , 默认为 6379
timeout : 设置客户端连接时的超时时间 , 单位为秒
loglevel : 等级分为 4 级 , debug , revbose , notice 和 warning , 生产环境下一般开启 notice
logfile : 配置 log 文件地址 , 默认使用标准输出 , 即打印在命令行终端的端口上
database : 设置数据库的个数 , 默认使用的数据库是 0
save : 设置 redis 进行数据库镜像的频率
rdbcompression : 在进行镜像备份时 , 是否进行压缩
dbfilename : 镜像备份文件的文件名
dir : 数据库镜像备份的文件放置的路径
slaveof : 设置该数据库为其他数据库的从数据库
masterauth : 当主数据库连接需要密码验证时 , 在这里设定
requirepass : 设置客户端连接后进行任何其他指定前需要使用的密码
maxclients : 限制同时连接的客户端数量
maxmemory : 设置redis能够使用的最大内存
appendonly : 开启 appendonly 模式后 , Redis 会把每一次所接收到的写操作都追加到 appendonly.aof 文件中 , 当 Redis 重新启动时 , 会从该文件恢复出之前的状态
appendfsync : 设置 appendonly.aof 文件进行同步的频率
vm_enabled : 是否开启虚拟内存支持
vm_swap_file : 设置虚拟内存的交换文件的路径
vm_max_momery : 设置开启虚拟内存后 , Redis 将使用的最大物理内存的大小 , 默认为 0
vm_page_size : 设置虚拟内存页的大小
vm_pages : 设置交换文件的总的page数量
vm_max_thrrads : 设置 vm IO 同时使用的线程数量
Windows系统
# 网址4,下载软件压缩包
# 进行解压后,放到存放的安装目录下(如,D:\dev\redis-2.4.5)
# cmd,切换到该目录下,执行
redis-server.exe redis.conf
# 安装完毕后,另开一个cmd窗口,依然该目录下,执行
redis-cli.exe -h 127.0.0.1 -p 6379 -a 123456
# OK
Mac系统
homebrew安装
错误问题解决
# redis-cli 连接时,提示:
DENIED Redis is running in protected mode because protected mode is enabled..# 解决:将配置文件里的
protected mode改为了no, 原本是yes
# redis-cli 连接时,提示:
Connection refused...
# 解决:可能是配置文件里面的 bind 字段设置了入口 IP , 将其注释
Redis的理解
优点
局限性
其他
通俗来说
使用
使用说明
一.服务器要先开启才能使用客户端
启动redis服务器: redis-server
进入redis客户端: redis-cli
二.说明
1. redis下,数据库是由一个整数索引标识,而不是由一个数据库名称,默认16个;
2. 每个redis-server 会有redis.conf,其中可以修改,数据库个数,端口,IP,日志...等所有设置;
3. 复制多个xx.conf文件,修改里面的port,启动的时候带上conf文件,就可以开启多个redis实例;
命令
通用
select 1 切换至索引为1的数据库中
keys * 查看当前库所有的键(最常用)
type key 查看键的类型(最常用)
keys 'a*' 查看以a开头的键 '*b' 查看以b结尾的键
exists key 看键是否存在 存在1 不存在0
ttl key 查看键的有效期 永久-1 已到期销毁-2
flushdb 只会清除当前的数据库下的数据
flushall 清空redis数据库所有数据
clear/ctrl + l 清屏
string
数据结构:一个键,仅仅对应一个值(字符串),每一个键都不同,是唯一的。
增改:-- set -- mset -- setex
set key value
mset key1 value1 key2 value2 ... 多个键值对
setex key seconds value 添加有效期(expire:到期)
set key value ex seconds 增改,同时添加有效期
获取: -- get -- mget
get key
mget key1 key2 ... 获取多个键所对应的值
删除: -- del -- expire
del key1 key2 ...
expire key seconds 设置键的有效期,删除键 -- 和上边 ttl key 常搭配
hash
数据结构:一个键,对应值是一片区域:key:{field:value,field:value,...}
hash: 用于存储对象,对象结构:属性、值,值的类型:string
修改:-- hset -- hmset
hset key field value 设置区域的单个属性 -- field(字段)
hmset key field1 value1 filed2 value2 ... 设置域的多个属性(字段)
获取:-- hkeys -- hvals -- hget -- hmget
hkeys key 获取该键的区域中所有属性(字段) -- field
hget key field 获取该键的区域中一个属性值
hmget key field1 field2 ... 获取该键的区域中多个属性值
hvals key 获取该键的区域中所有属性值
删除:-- hdel
hdel key field1 field2 ... 删除多个属性值
list(双向链表 -> 队列、栈)
数据结构:一个键,对应值是一片区域:key:[value1, value2, ...]
结构是:左侧压入/右侧压入,或者插入,
索引是固定的,从左边往右排(0,1,2,...),值的类型:string
增加:-- lpush -- rpush -- linsert
lpush key value1 value2 ... 左侧压入数据
rpush key value1 value2 ... 右侧压入数据
linsert key before oldvalue newvalue ... 指定key,旧元素前插入元素
linsert key after oldvalue newvalue ... 指定key,旧元素后插入元素
例子:
127.0.0.1:6379> lpush name xiaoming xiaohu xiaoxin
(integer) 3
127.0.0.1:6379> lrange name 0 -1
1) "xiaoxin"
2) "xiaohu"
3) "xiaoming"
127.0.0.1:6379> linsert name before xiaohu xiaohong
(integer) 4
127.0.0.1:6379> lrange name 0 -1
1) "xiaoxin"
2) "xiaohong"
3) "xiaohu"
4) "xiaoming"
获取:-- lrange --llen --lindex
llen key 返回列表key的长度
lindex key index 返回列表key中,下标为index的元素
lrange key start stop 获取从索引start到stop位置的元素
如:lrange key 0 -1 查看该键对应值的全部value
注意:索引可以为负数,表示尾部(右侧)开始计数,...,-2,-1
修改:-- lset
lset key index value 修改指定索引位置的元素值
删除:-- lrem -- del
del key 将列表key删除
lrem key count value 将列表key中,前count次值为value的元素删除
count>0: 从头(左边)开始数
count<0: 从尾(右边)到头数
count=0: 查找所有value值的元素
裁剪:-- ltrim
ltrim key start stop 让列表只保留指定区间内的元素,其他元素删除
弹出: -- lpop -- rpop
lpop key 执行一次,将列表key的头元素(index=0)弹出(移除)一个,如果在执行后,列表没有元素了,则列表key自动删除(该列表消失)
rpop key 同上,不过是尾元素
技术点:list实现队列、栈 (压入、弹出)
127.0.0.1:6379> lpush name wo_1 wo_2 wo_3 wo_4 # 左边压入
(integer) 4
127.0.0.1:6379> lrange name 0 -1
1) "wo_4"
2) "wo_3"
3) "wo_2"
4) "wo_1"
127.0.0.1:6379> lindex name 0
"wo_4"
127.0.0.1:6379> lpop name # 后进先出:左边压入,左边弹出,即栈
"wo_4"
127.0.0.1:6379> lpop name
"wo_3"
127.0.0.1:6379> rpop name # 先进先出:左边压入,右边弹出,即队列
"wo_1"
127.0.0.1:6379> lrange name 0 -1
1) "wo_2"
set
数据结构:一个键,对应值是一片区域:key:(member1, member2, ...)
无序集合,元素唯一性,不重复,值的类型: string
增改:-- sadd
sadd key member1 member2 ... 向集合key中的区域中添加多个数据
smove key1 key2 member 将集合key1中的元素移动到key2中
注意:key1会删除该元素,key2如果已经有该元素,则不进行任何操作
获取:-- smembers -- scard
smembers key 获取集合key中的区域内的所有元素
scard key 获取集合key中的元素个数
删除:-- srem
srem key member 删除集合key中区域内的指定元素
弹出:--spop
spop key 移除并返回集合key中的一个随机元素,若执行一次后,集合中没有元素了,则删除集合key(消失)
注意:交集、差集、并集,只是查询,并不会改变原来集合的数据
交集:-- sinter
sinter key1 key2 key3 ... 获取这些集合key1,key2,..的交集(都有的元素)
差集:-- sdiff
sdiff key1 key2 key3 ... 集合key1减去key1,key2,...的交集,获取返回剩下的差集
并集:-- sunion
sunion key1 key2 ... 获取key1,key2,....这些集合的并集
zset
数据结构:一个键,对应值是一片区域:key: (score1: member1, score2: member2, ...)
有序集合,按权重score大小将成员排序,元素唯一性,不重复,值的类型:string
注意:权重score可以一样大小,但成员不能重复,唯一的
增改:-- zadd
zadd key score1 member1 score2 member2 ... 向集合key中添加多个数据
注意:如果添加成员是原来就有的,则权重会覆盖(即,用最新的)
获取:-- zrange -- zrangebyscore
zcard key 获取集合key中的成员数量
zcount key min max 获取集合key中score权重值间(包含)的成员数量
zrangebyscore key min max 获取集合key中score权重值间(包含)的成员
zscore key member 获取集合key中 member 成员对应的权重值score
zrank key member 获取集合key中该成员的排名
zrange key start stop 获取指定范围内的member成员
start, stop: 下标不是权重!!,0第一个成员,1第二个成员
负数:....,-2,-1 一个道理
127.0.0.1:6379> zrange name 0 -1 # 查看所有成员
1) "xiaoming"
2) "zhongming"
3) "daming"
127.0.0.1:6379> zcard name
(integer) 3
127.0.0.1:6379> zscore name xiaoming # 查看权重
"5"
127.0.0.1:6379> zrank name daming # 查看排名,第三名
(integer) 2
127.0.0.1:6379> zrank name xiaoming # 第一名
(integer) 0
删除:-- zrem -- zremrangebyscore
zrem key member1 member2 ... 删除集合key中指定的成员
zremrangebyscore key min max 删除集合key中指定权重范围内的成员
注意:删除了成员,对应的权重自然也消失,如果删除执行后,集合中没有成员了,那么集合key也会自动删除
Pub/sub(发布/订阅)
redis.conf(配置信息)
# 绑定的port
port 6379
# 绑定的IP (默认本机),若允许远程访问,则注释此行,解除绑定本机
bind 127.0.0.1
# 找到这一行,默认不是守护进程,会阻塞终端,改成yes,在后台运行,非阻塞(基本都会修改此配置,为yes)
daemonize no
# 这一行表示可持久化文件存储在dump.rdb文件中,可自定义文件名
dbfilename dump.rdb
# 修改持久化文件的存储路径,一般第一次安装都会自定义
dir /var/lib/redis
# 设置日志文件的路径,找到loglevel notice这一行,在其下面,redis默认不记录日志,一般开发者都会设置
logfile /var/log/redis/redis-server.log
# 设置密码(若需要),redis默认没有设置认证,grep -n requirepass redis.conf查看在哪一行,然后设置密码,取消requirepass foobared 的注释,将foobared的位置换成自己的密码,注意需要重启redis-server,redis-cli -h host -p port
requirepass 123456
# 不输入密码,不能进行读写操作
replication(复制 -- 主从)
查看官方文档:http://doc.redisfans.com/
文档中的,此模块详解,原理,配置等。
关键点:xxx.rdb文件 和 在持久化此文件期间的新写入命令。
配置从服务器,很简单,只需配置文件添加:
slaveof 192.168.1.1 6379 当然替换成主服务器的IP和端口号
因为 Redis 使用异步复制, 所以主服务器发送的写数据并不一定会被从服务器接收到, 因此, 数据丢失的可能性仍然是存在的。
配置主从(以ubuntu为例)
目前配置只改动过:daemonize yes 守护线程
配置主:
1. 查看主机ip: ifconfig -> 192.168.26.128
2. 修改配置:cd /etc/redis/redis.conf -> sudo vi redis.conf -> bind 192.168.26.128 -> port 6379
3. 重启主redis服务:sudo service redis stop -> redis-server redis.conf
配置从:(同一台电脑为例)
1. ip 省了;
2. 配置文件,复制一份并重命名:sudo cp redis.conf ./slave.conf
3. 修改配置:sudo vi slave.conf -> bind 192.168.26.128 -> slaveof 192.168.26.128 6379 -> port 6378
4. 启动从redis服务:sudo redis-server slave.conf
查看主从关系:redis-cli -h 192.168.26.128 info Replication
使用:
1. 进入主客户端:redis-cli -h 192.168.26.128 -p 6379
2. 主,写数据
3. 进入从客户端:redis-cli -h 192.168.26.128 -p 6378
4. 从,读数据
搭建集群(ubuntu为例)
1. 在Desktop 建 config 文件夹,内建6个 xxx.conf 空白文件,内部分别写上配置信息,形成配置文件 7000.conf -- 7005.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
2. cd到桌面下的 config 目录下,加载配置文件分别启动6个redis服务
sudo redis-server xxx.conf
3. 查看进程:
ps aux | grep redis
常用命令:
ps aux | grep redis 查看redis服务器进程
sudo kill -9 pid 杀死redis服务器
sudo redis-server /etc/redis/redis.conf 指定加载的配置文件
4. redis的安装包中包含了redis-trib.rb,复制一份到本地的bin目录下,⽤于创建集群,在主电脑上,执行命令:
sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/
5. 安装ruby环境,因为redis-trib.rb是⽤ruby开发的
sudo apt-get install ruby
6. 创建集群命令:
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
6.1 执⾏上⾯这个指令在某些机器上可能会报错,主要原因是由于安装的 ruby 不是最 新版本!
天朝的防⽕墙导致⽆法下载最新版本,所以需要设置 gem 的源;
查看下自己的 gem 源地址:
gem source -l 如果是https://rubygems.org/ 就需要更换
6.2 解决办法:
更换 gem 源指令:
gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
通过 gem 安装 redis 相关依赖:
sudo gem install redis
6.3 重新输入创建集群命令即可:
01、注意:IP 这是当时的,自己配置用自己的;
02、过程中:提示是否创建 系统推荐的主从关系 输入 yes 即可;
7. 提示成功,搭建集群完成。
7.1 M - 主 S - 从
7.2 slots:0-5460 (5461 slots) master slots: 槽点范围,数据存储,槽点在那个范围,就存在那个主服务器
使用集群:
1. 在172.16.179.131机器上连接7003,加参数-c表示连接到集群
redis-cli -h 172.16.179.131 -c -p 7003
2. 写入数据
set name zhangsan
3. Redirected to slot [5798] located at 172.16.179.131:7001
表示 7003 从服务器只有读功能,写数据会自动跳转在一个主服务器上,跳在那个服务器上,按槽点来(slot[5798])来自动分配;
4. 读数据
get name
5. Redirected to slot [5798] located at 172.16.179.131:7001
表示 查找的内容 重定向在 7001 主服务上,并读数据,然后自动跳转到 7001 主客户端上
参考链接
官方文档:http://doc.redisfans.com/