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是一个key-value存储系统: key为字符串类型,只能通过key对value进行操作。
- 支持多种数据结构类型(丰富)包括: string、list(双向链表)、set、zset(有序集合)和hash(hash表)。
- Redis支持主从同步,通过Replication进行数据复制,通过master-slave机制,数据可以从主服务器向任意数量的从服务器上同步。
- 支持持久化,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。----- Redis数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的LRU算法删除数据。
- 仅支持单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
- 支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。
- 支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点又是缺点。
局限性
- Redis只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6wQPS每秒(取决于数据结构,数据大小以及服务器硬件性能,日常环境中QPS高峰大约在1-2w左右)。
- Redis在string类型上会消耗较多内存,可以使用hash(hash表)压缩存储以降低内存耗用。
其他
- 网络层:客户端和服务器通过 TCP 连接来进行数据交互,服务器默认的端口号为 6379,客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾。
- 按统一请求协议,所有发送至 Redis 服务器的参数都是二进制安全(binary safe)的。
通俗来说
- 运行速度快。
- 用于缓存(内存数据库)
- 属于 nosql 数据库
使用
使用说明
一.服务器要先开启才能使用客户端
启动redis服务器: redis-server
进入redis客户端: redis-cli
二.说明
1. redis下,数据库是由一个整数索引标识,而不是由一个数据库名称,默认16个;
2. 每个redis-server 会有redis.conf,其中可以修改,数据库个数,端口,IP,日志...等所有设置;
3. 复制多个xx.conf文件,修改里面的port,启动的时候带上conf文件,就可以开启多个redis实例;
三.特点
不同的redis中key的类型,适用于不同的应用场景,很贴切生活需求.
命令
通用
select 1 切换至索引为1的数据库中
keys * 查看当前库所有的键(最常用)
type key 查看键的类型(最常用)
del key 删除redis中当前库中的键key,通用,key删除了,对应的值也就没了 -- 删多个:del key1 key2 ...
keys 'a*' 查看以a开头的键 '*b' 查看以b结尾的键
exists key 看键是否存在 存在1 不存在0
ttl key 查看键的有效期 永久-1 已到期销毁-2
flushdb 只会清除当前的数据库下的数据
flushall 清空redis数据库所有数据
clear/ctrl + l 清屏
库
127.0.0.1:6379> 库0,登录客户端,默认在库0中,而且不会显示当前库的编号
127.0.0.1:6379[1]> 库1,非库0的其他任何库,会端口的后边[1],会显示当前库的编号
tristadeMacBook-Air:~ trista$ redis-cli
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379>
string
数据结构:一个键,仅仅对应一个值(字符串),每一个键都不同,是唯一的。
增改:-- set -- mset -- setex
set key value 增改,同时默认设置了有效期为永远
set key value ex seconds 增改,同时添加有效期
set key value px millliseconds 增改,同时设置有效期 -- px: 设置的是毫秒,如: px 5000 即,5000毫秒(5秒)
setex key seconds value 增改,同时添加有效期(expire:到期)
mset key1 value1 key2 value2 ... 多个键值对,这种默认都是有效期永远,mset命令没有设置有效期的参数
获取: -- get -- mget
get key
mget key1 key2 ... 获取多个键所对应的值
删除: -- del -- expire
del key1 key2 ... 删除多个键key,注意:这个命令,用于所有redis的键都可以,删除了键,值也就没了
expire key seconds 设置键的有效期(小于0即可,如:-1 -2 -3 ...),删除键 -- 和上边 ttl key 常搭配
hash
数据结构:一个键,对应值是一片区域:key:{field:value,field:value,...}
hash: 用于存储对象,对象结构:属性、值,值的类型:string
修改:-- hset -- hmset
hset key field value 设置区域的单个属性 -- field(字段)
hmset key field1 value1 filed2 value2 ... 设置域的多个属性(字段)
获取:-- hget -- hmget -- hkeys -- hvals
hget key field 获取该键key的区域中一个属性值
hmget key field1 field2 ... 获取该键key的区域中多个属性值
hkeys key 获取该键key的区域中所有field属性名称(字段名称),~雷同:for key, value in hash.items()
hvals key 获取该键key的区域中所有属性值
删除:-- hdel
hdel key field1 field2 ... 删除多个属性值
del key1 key2 ... 删除多个键key
list(双向链表 -> 队列、栈)
数据结构:一个键,对应值是一片区域:key:[value1, value2, ...]
索引编号位置固定,所以在 "增加/删除" 元素时,每个元素的索引可能会发生变化!!!
结构是:左侧压入/右侧压入,或者插入, --- 如同:电影院中,已经排好号的座位,等待着人入座.
索引是固定的,从左边往右排(0,1,2,...),值的类型:string
增加:-- lpush -- rpush -- linsert
lpush key value1 value2 ... 左侧压入数据 -- 特点:之前的元素索引会改变
rpush key value1 value2 ... 右侧压入数据 -- 类比:列表的append命令,特点:之前的元素索引没变
linsert key before oldvalue newvalue ... 指定key,旧元素前插入元素 -- 特点:oldvalue有重复时,以左边第一次出现为准
linsert key after oldvalue newvalue ... 指定key,旧元素后插入元素 -- 特点:oldvalue有重复时,以左边第一次出现为准
例子:
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 修改指定索引index位置的元素值,index的值要小于当前列表key的长度
删除:-- 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 # 先进先出:左边压入,右边弹出,即队列 -- 如:celery消息队列
"wo_1"
127.0.0.1:6379> lrange name 0 -1
1) "wo_2"
set
数据结构:一个键,对应值是一片区域:key:(member1, member2, ...)
无序集合,元素member唯一性,不重复,值的类型: string
增改:-- sadd
sadd key member1 member2 ... 向集合key中的区域中添加多个数据
smove key1 key2 member 将集合key1中的元素移动到key2中
注意:key1会删除该元素,key2如果已经有该元素,则不进行任何操作
获取:-- smembers -- scard
scard key 获取集合key中的元素个数
smembers key 获取集合key中的区域内的所有元素
删除:-- srem
srem key member 删除集合key中区域内的指定元素
del key1 key2 ... 通用,删除key
弹出:--spop
spop key 移除并返回集合key中的一个随机元素,若执行一次后,集合中没有元素了,则删除集合key(消失)
-- 注意:交集、差集、并集,只是查询,并不会改变原来集合的数据
交集:-- sinter
sinter key1 key2 key3 ... 获取这些集合key1,key2,..的交集(都有的元素)
差集:-- sdiff
sdiff key1 key2 key3 ... 集合key1减去key1,key2的交集,获取返回剩下的差集kk1
注意,多个key:若有key3,则以此差集kk1减去kk1,key3的交集,获取返回的剩下差集kk2,以此类推...
并集:-- sunion
sunion key1 key2 ... 获取key1,key2,....这些集合的并集
zset
数据结构:一个键,对应值是一片区域:key: (score1: member1, score2: member2, ...)
有序集合,按权重score大小将成员排序,从而形成索引顺序,元素唯一性,不重复,值的类型:string
注意:权重score可以一样大小(可以重复),但成员不能重复,唯一的
特点:权重发生变化,排序索引也会随之变化.
场景:我自己当前脑海里先想到的就是,nginx的配置 -- 其中的权重配置模式.
增改:-- zadd
zadd key score1 member1 score2 member2 ... 向集合key中添加多个数据
注意:
1. 如果添加成员是原来就有的,则权重会覆盖(即,用最新的)-- 也就是:修改... ~_~
2. 如果添加成员不同之前,但权重一样,会在同样权重后插入,注意:及时,目前有3个同样权重的不同成员值,在使用zadd添加时,同样权重的待添加成员,也会插入在该权重第一次出现的成员后边,不会排在所有同权重成员后边.
获取:-- zrange -- zrangebyscore
zcard key 获取集合key中的成员数量
zrank key member 获取集合key中该成员的排名(索引)
zrange key start stop 获取指定范围内(索引,非权重)的member成员 -- 如:zrange key 0 -1
start, stop: 下标不是权重!!,0第一个成员,1第二个成员
注意:负数:....,-2,-1 -- 跟list类型中的lrange的索引使用,一个道理
zcount key min max 获取集合key中score权重值间(包含)的成员数量 -- 闭区间:[min, max]
zrangebyscore key min max 获取集合key中score权重值间(包含)的成员值 -- 闭区间:[min, max]
zscore key member 获取集合key中member成员对应
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中指定权重范围内的成员 -- 闭区间:[min, max]
注意:删除了成员,对应的权重自然也消失,如果删除执行后,集合中没有成员了,那么集合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/