天天看点

Redis 从入门到进化

下载:https://github.com/MicrosoftArchive/redis/releases
1.redis启动(3.0之前单例不支持集群,3.0之后支持集群)
(1)redis-server redis.windows.conf
(2)redis-cli -h 127.0.0.1 -p 6379 -a 123zgf
(3)redis 清除当前库缓存 flushdb
(4)切换数据库,默认有16个,编号从0开始到15
(5)增量迭代查询一个集合元素。scan( 0 match *) sscan( key 0 match *) zscan( key 0 match *) hscan( key 0 match *) 
(6)(multi exec)单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
(7)ping(运行) 	echo (输出字符串)  quit(终止)
(8)数据库切换 select 0(默认);move key db;rename key newkey
2.关于string
//(1)保存并更新
set name '张三'
get name
mset a 100 b 200 c 300
mget a b c
//(2)存在性,0不存在,1存在
exists a
//(3)删除,0删除失败,1删除成功
del a
//(4)type ,存在string,不存在none
type a
//(5)过期时间
set a 100 ex 5
或
set a 100
expire a 5
补充
incr a(相当于++)
incrby a 10
decr a(相当于--)
decrby a 10
getset aa 100 (返回赋值前结果,然后赋值100)
setnx a 123(如果a存在则不赋值,如果不存在则赋值)
msetnx  aa 123 a 345(多个setnx)
3.关于list(双向链表结构,快速更新)
       //(1)右侧添加
rpush a 100
rpush a 200
//(2)左侧添加
lpush a -100
//(3)查询所有,0第一个,-1倒数第一个,-2倒数第二个(或3,2,1,0,1,2,3)
lrange a 0 -1
//(4)右边弹出一个元素,返回弹出元素的值(如果没有元素则返回null)
rpop a
//(5)左边弹出一个元素,返回弹出元素的值(如果没有元素时返回null)
lpop a
//(6)上限列表(业务需求,只展示最近的3条新闻,======添加并且裁剪就可以实现)
lpush a 1 2 3 4 5
//(7)模拟实现队列(一个进程的列表中添加项,用另一个进程来处理这些项。这就是通常的生产者消费者)
lpush a 5
brpop a 60 (等待a列表中的元素,如果60秒后还没有可用元素就返回)
===========注意:当所有元素弹出后,键就不存在了。
===========注意:阻塞只有pop有
================补充===================== 
llen a(长度)
lset a index value(指定位置改值)
ltrim a 0 3(指定索引截取)
lrange a 0 -1(查看)
4.hashes(哈希就是一种压缩映射,不是hash table 是 small hash,是一种键值对映射表)
hmset user:100 username zgf age 27 ... ...
hmget user:100 username age ...
hincrby user:100 age 10 (zgf的年龄增加10岁)
hset user:100 username zph
hget user:100 username
/补充///
hkeys user:100
hvals user:100
hlen user:100
hexists user:100 username
hgetall user:100
5.sets
sadd a 100 1000 10000
spop a (随机弹出一个元素)
srem a 100(删除指定字符串)
smembers a
smove srckey dstkey member(转移,并删除)
sismember a 100 (返回0不是,返回1是)
sinter a b (取交集)
sinterstore c a b (取交集)
sunion a b(并集)
sunionstore zgf a b ...(多个集合取交集并赋值给zgf,如果是一个集合则是复制)
sdiff a b
sdiffstore c a b
scard a (返回集合中元素数量)

6.sorted sets(排行榜的应用)
zadd key score member 添加元素到集合,元素在集合中存在则更新对应 score。 
zrem key member 删除指定元素,1 表示成功,如果元素不存在返回 0。 
 zincrby key incr member 增加对应 member 的 score 值,然后移动元素并保持 skip list 保持有 序。返回更新后的 score 值。 
zrank key member 返回指定元素在集合中的排名(下标),集合中元素是按 score 从小到大 排序的。 
zrevrank key member 同上,但是集合中元素是按 score 从大到小排序。
zrange key start end 类似 lrange 操作从集合中去指定区间的元素。返回的是有序结果 
zrevrange key start end 同上,返回结果是按 score 逆序的。 
zrangebyscore key min max 返回集合中 score 在给定区间的元素。
zcount key min max 返回集合中 score 在给定区间的数量。 
zcard key 返回集合中元素个数。
zscore key element 返回给定元素对应的 score。 
zremrangebyrank key min max 删除集合中排名在给定区间的元素。 
zremrangebyscore key min max 删除集合中 score 在给定区间的元素
7.pfloglog
pfadd a 123 345 456 567
pfcount a
pfmerge b a a2 ...
8.批量操作
multi
set a 100
set b 200
set c 300
exec
9.订阅
subscribe hero
publish hero welcome to school
10.脚本
 EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
=====================================================================
高级:
1.备份:save同步,bgsave异步(适合线上备份)
查找路径:config get dir 的路径下的dump.rdb文件
2.安全:config get requirepass
config set requirepass password
3.一主(redis)二从(redis)三哨兵(sentinel.conf)
参照:https://www.cnblogs.com/ouyangnengjun/p/redis.html
1)一主
protected-mode no
bind 127.0.0.1
port 6380
requirepass 123zgf
2)二从
protected-mode no
bind 127.0.0.1
port 6380
requirepass 123zgf
slaveof 127.0.0.1 6379
masterauth 123zgf
++++++++++++++++++
protected-mode no
bind 127.0.0.1
port 6381
requirepass 123zgf
slaveof 127.0.0.1 6379
masterauth 123zgf
3)三哨兵(主宕机(shutdown),回复后成从;从宕机恢复后还是从)
哨兵命令:redis-server redis.windows.conf --sentinel
sentinel.conf (只改哨兵port即可,其他一样)
//哨兵端口
port 26379 
protected-mode no
#哨兵监听的主服务器
sentinel monitor mymaster 127.0.0.1 6379 2
#3s内mymaster无响应,则认为mymaster宕机了
sentinel down-after-milliseconds mymaster 3000
#如果10秒后,mysater仍没启动过来,则启动failover
sentinel failover-timeout mymaster 10000
#执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步
sentinel parallel-syncs mymaster 1
#主从有密码
sentinel auth-pass mymaster 123zgf
+++++++++++++++++++++++++++++++
port 26380
protected-mode no
#哨兵监听的主服务器
sentinel monitor mymaster 127.0.0.1 6379 2
#3s内mymaster无响应,则认为mymaster宕机了
sentinel down-after-milliseconds mymaster 3000
#如果10秒后,mysater仍没启动过来,则启动failover
sentinel failover-timeout mymaster 10000
#执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步
sentinel parallel-syncs mymaster 1
#主从有密码
sentinel auth-pass mymaster 123zgf
++++++++++++++++++++++++++++++++
port 26381
protected-mode no
#哨兵监听的主服务器
sentinel monitor mymaster 127.0.0.1 6379 2
#3s内mymaster无响应,则认为mymaster宕机了
sentinel down-after-milliseconds mymaster 3000
#如果10秒后,mysater仍没启动过来,则启动failover
sentinel failover-timeout mymaster 10000
#执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步
sentinel parallel-syncs mymaster 1
#主从有密码
sentinel auth-pass mymaster 123zgf
4.集群 http://www.redis.cn/topics/cluster-tutorial.html
(1)Redis3.0新特性:
①    节点自动发现
②    slave->master 选举,集群容错
③    Hot resharding:在线分片
④    进群管理:clusterxxx
⑤    基于配置(nodes-port.conf)的集群管理
⑥  ASK转向/MOVED 转向机制
(2)安装:
Ruby下载 (http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.2.4-x64.exe)
Redis的驱动(https://rubygems.org/gems/redis/versions/3.2.2)(命令:gem install --local G:\Ruby22-x64\redis-3.2.2.gem)
(3)集群相关命令(取消集群则直接删除notes-number.conf)
参照:
https://blog.csdn.net/phantom_111/article/details/80328049
https://blog.csdn.net/a67474506/article/details/50435845
注意: 1.多键的命令操作(如MGET、MSET),如果每个键都位于同一个节点,则可以正常支持,否则会提示错误
     2.集群中的节点只能使用0号数据库,如果执行SELECT切换数据库会提示错误
批量添加主节点
redis-trib.rb  create --replicas 0 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381
批量添加从主节点
redis-trib.rb  create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
1.添加主节点:
ruby>redis-trib.rb add-nodes 127.0.0.1:6385(新) 127.0.0.1:6384(老)
ruby>redis-trib.rb add-node --slave --master-id 3c382aa3386ce956483d4b032f62e98af4ec32d2 10.10.1.115h6380 10.10.1.117h6379
2.添加卡槽
ruby>redis-trib.rb reshard 127.0.0.1:6485
ruby>1000
ruby>all
ruby>yes
3.主节点转从节点
redis>cluster relicate 主节点id
4.删除带卡槽的节点
ruby>redis-trib.rb reshard 127.0.0.1:6385
ruby-slots>1000
ruby-source>待删除节点的id
ruby-receive-#1>待接收的id
ruby-receive-#2>done
ruby>redis-trib.rb del-node 127.0.0.1:6385  id 
5.删除没有卡槽的节点
ruby>redis-trib.rb del-node 127.0.0.1:6385  id 


*5.Redis 虚拟内存(适用于 value 比 key 大的情况)
概念:把不常用的value从内存转换到磁盘,从而腾出宝贵的内存空间
流程:如果是由于太多 key 很小的 value 造成的内存问题,那么 redis 的虚拟内存并不能解 决问题。和操作系统一样 redis 也是按页来交换对象的。redis 规定同一个页只能保存一个 对象。但是一个对象可以保存在多个页中。在 redis 使用的内存没超过 vm-max-memory 之前 是不会交换任何 value 的。当超过最大内存限制后,redis 会选择把较老的对象交换到 swap 文件中去。如果两个对象一样老会优先交换比较大的对象,精确的交换计算公 式 swappability = age*log(size_in_memory)。 对于 vm-page-size 的设置应该根据自己应用 将页的大小设置为可以容纳大多数对象的尺寸。太大了会浪费磁盘空间,太小了会造成交换 9 文件出现过多碎片。对于交换文件中的每个页,redis 会在内存中用一个 1bit 值来对应记 录页的空闲状态。所以像上面配置中页数量(vm-pages 134217728 )会占用 16MB 内存用来记 录页的空闲状态。vm-max-threads 表示用做交换任务的工作线程数量。如果大于 0 推荐设 为服务器的 cpu 的核心数。如果是 0 则交换过程在主线程进行。
主要理由有以下两点: 
1. 操作系统的虚拟内存是以 4k/页为最小单位进行交换的。而 redis 的大多数对象都远小 于 4k,所以一个操作系统页上可能有多个 redis 对象。另外 redis 的集合对象类型如 list,set 可能存在于多个操作系统页上。最终可能造成只有 10%的 key 被经常访问,但 是所有操作系统页都会被操作系统认为是活跃的,这样只有内存真正耗尽时操作系统才 会进行页的交换。(分散不集中,命中率不高)
 2. 相比操作系统的交换方式。redis 可以将被交换到磁盘的对象进行压缩,保存到磁盘的对 象可以去除指针和对象元数据信息。一般压缩后的对象会比内存中的对象小 10 倍。这 样 redis 的虚拟内存会比操作系统的虚拟内存少做很多 IO 操作。
============注意:redis 的虚拟内存在设计上为了保证 key 的查询速度,只会将 value 交换到 swap 文件 中。
配置:
vm-enabled yes #开启虚拟内存功能 
vm-swap-file /tmp/redis.swap #交换出来 value 保存的文件路径/tmp/redis.swap 
vm-max-memory 268435456 #redis 使用的最大内存上限(256MB),超过上限后 redis 开始交换 value 到磁盘 swap 文件中。建议设置为系统空闲内存的 60%-80% 
vm-page-size 32 #每个 redis 页的大小 32 个字节 
vm-pages 134217728 #最多在文件中使用多少个页,交换文件的大小 = (vm-page-size * vm-pages)4GB 
vm-max-threads 8 #用于执行 value 对象换入换出的工作线程数量。0
*6.主从复制
Redis 支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。 
(1)概述:
1) master 可以有多个 slave。 
2) 除了多个 slave 连到相同的 master 外,slave 也可以连接其它 slave 形成图状结构。 
3) 主从复制不会阻塞 master。也就是说当一个或多个 slave 与 master 进行初次同步数据 时,master 可以继续处理客户端发来的请求。相反 slave 在初次同步数据时则会阻塞 不能处理客户端的请求。
 4) 主从复制可以用来提高系统的可伸缩性,我们可以用多个 slave 专门用于客户端的读 请求,比如 sort 操作可以使用 slave 来处理。也可以用来做简单的数据冗余。
 5) 可以在 master 禁用数据持久化,只需要注释掉 master 配置文件中的所有 save 配置,然 后只在 slave 上配置数据持久化。
(2)过程:
当设置好 slave 服务器后,slave 会建立和 master 的连接,然后发送 sync 命令。无论是 第一次同步建立的连接还是连接断开后的重新连接,master 都会启动一个后台进程,将数据 库快照保存到文件中,同时 master 主进程会开始收集新的写命令并缓存起来。后台进程完 成写文件后,master 就发送文件给 slave,slave 将文件保存到磁盘上,然后加载到内存恢复 数据库快照到 slave 上。接着 master 就会把缓存的命令转发给 slave。而且后续 master 收到 的写命令都会通过开始建立的连接发送给slave。从master到slave的同步数据的命令和从 客 户端发送的命令使用相同的协议格式。当 master 和 slave 的连接断开时 slave 可以自动重新 建立连接。如果 master 同时收到多个 slave 发来的同步连接命令,只会启动一个进程来写数 据库镜像,然后发送给所有 slave。
(3)配置 
       首先:slave 服务器很简单,只需要在配置文件中加入如下配置 slaveof 192.168.1.1 6379 #指定 master 的 ip 和端口
       然后:主库添加密码验证后,从库需要配置如下参数:
       requirepass "password"
       masterauth "password"
--------------------- 本文来自 jiangxiaoge1023 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/jiangxiaoge1023/article/details/51568415?utm_source=copy
*7.持久化
1) 快照方式:(默认持久化方式) 这种方式就是将内存中数据以快照的方式写入到二进制文件中 ,默认的文件名为 dump.rdb。 客户端也可以使用 save 或者 bgsave 命令通知 redis 做一次快照持久化。save 操作是在 主线程中保存快照的,由于 redis 是用一个主线程来处理所有客户端的请求,这种方式会阻 塞所有客户端请求。所以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数 据完整写入到磁盘一次,并不是增量的只同步增量数据。如果数据量大的话,写操作会比较 多,必然会引起大量的磁盘 IO 操作,可能会严重影响性能。 注意:由于快照方式是在一定间隔时间做一次的,所以如果 redis 意外当机的话,就会 丢失最后一次快照后的所有数据修改。
2) 日志追加方式: 这种方式 redis 会将每一个收到的写命令都通过 write 函数追加到文件中(默认 appendonly.aof)。当 redis 重启时会通过重新执行文件中保存的写命令来在内存中重建整 个数据库的内容。当然由于操作系统会在内核中缓存 write 做的修改,所以可能不是立即写 到磁盘上。这样的持久化还是有可能会丢失部分修改。不过我们可以通过配置文件告诉 redis 我们想要通过 fsync 函数强制操作系统写入到磁盘的时机。有三种方式如下(默认是: 每秒 fsync 一次) appendonly yes //启用日志追加持久化方式 #appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全 的持久化,不推荐使用 appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折 中,推荐 #appendfsync no //完全依赖操作系统,性能最好,持久化没保证 
日志追加方式同时带来了另一个问题。持久化文件会变的越来越大。例如我们调用 incr test 命令 100 次,文件中必须保存全部 100 条命令,其实有 99 条都是多余的。因为要恢复 数据库状态其实文件中保存一条 set test 100 就够了。为了压缩这种持久化方式的日志文件。 redis 提供了 bgrewriteaof bgrewriteaof bgrewriteaof bgrewriteaof 命令。收到此命令 redis 将使用与快照类似的方式将内存中的数据 以命令的方式保存到临时文件中,最后替换原来的持久化日志文件。
=======================================================================
DBSIZE 返回当前数据库 key 的数量。 
INFO 返回当前 redis 服务器状态和一些统计信息。 
MONITOR  实时监听并返回redis服务器接收到的所有请求信息。
SHUTDOWN 把数据同步保存到磁盘上,并关闭redis服务。 
CONFIG GET parameter 获取一个 redis 配置参数信息。(个别参数可能无法获取) 
CONFIG SET parameter value 设置一个 redis 配置参数信息。(个别参数可能无法获取) 
CONFIG RESETSTAT  重置 INFO 命令的统计信息。(重置包括:Keyspace 命中数、 Keyspace 错误数、 处理命令数,接收连接数、过期 key 数) 
DEBUG OBJECT key 获取一个 key 的调试信息。 
DEBUG SEGFAULT 制造一次服务器当机。 
FLUSHDB 删除当前数据库中所有 key,此方法不会失败。小心慎用 
FLUSHALL 删除全部数据库中所有 key,此方法不会失败。小心慎用

=============================示例================================
https://blog.csdn.net/qq_40417179/article/details/80987085

           

继续阅读