Redis系列之Reids介绍
1.什么是redis
redis是一种基于键值对(key-value)数据库,其中value可以为string、hash、list、set、zset等多种数据结构,可以满足很多应用场景。还提供了键过期,发布订阅,事务,流水线,等附加功能,
流水线: Redis 的流水线功能允许客户端一次将多个命令请求发送给服务器, 并将被执行的多个命令请求的结果在一个命令回复中全部返回给客户端, 使用这个功能可以有效地减少客户端在执行多个命令时需要与服务器进行通信的次数。
2. redis有哪些特性
1〉速度快,数据放在内存中,官方给出的读写性能10万/S,与机器性能也有关
a. 数据放内存中是速度快的主要原因
b. C语言实现,与操作系统距离近
c. 使用了单线程架构,预防多线程可能产生的竞争问题
2〉键值对的数据结构服务器
3〉丰富的功能:键过期,发布订阅,事务,流水线.....
4〉简单稳定:单线程
5〉持久化:发生断电或机器故障,数据可能会丢失,持久化到硬盘
6〉主从复制:实现多个相同数据的redis副本
7〉高可用和分布式:哨兵机制实现高可用,保证redis节点故障发现和自动转移
8〉客户端语言多:java php python c c++ nodejs等
3. redis有哪些应用场景
1. 缓存:合理使用缓存加快数据访问速度,降低后端数据源压力
2. 排行榜:按照热度排名,按照发布时间排行,主要用到列表和有序集合
3. 计数器应用:视频网站播放数,网站浏览数,使用redis计数
4. 社交网络:赞、踩、粉丝、下拉刷新
5. 消息队列:发布和订阅
4.redis的版本
版本号第二位为奇数,为非稳定版本(2.7、2.9、3.1)
第二为偶数,为稳定版本(2.6、2.8、3.0)
当前奇数版本是下一个稳定版本的开发版本,如2.9是3.0的开发版本
5.全局命令
keys * 查看所有键
dbsize 查看的是当前所在redis数据库的键总数 如果存在大量键,线上禁止使用此指令
exists key 检查键是否存在,存在返回1,不存在返回0
del key 删除键,返回删除键个数,删除不存在键返回0
expire key seconds 设置键过期的时间,单位是秒, //set name lgs expire name 10 //10秒过期
ttl key 查看键剩余的过期时间,和expire配合使用
type key 查看键的数据结构类型: //type name //返回string,键不存在返回none
6.redis键管理
键重命名
rename oldKey newkey //格式
rename oldKey newKey //若oldKey之前存在则被覆盖
set name james ;set name1 mike //数据初始化
renamenx name name1 //重命名失败,只有当name1不存在才能改名
返回随机键
randomkey //返回随机键
键过期
expire name:03 20 //键name:03 在10秒后过期
ttl name:03 //查看过期按秒到计时,当返回-2说明已删除
pttl name:03 //查看过期按毫秒到时计
set name:05 james //初始化数据
pexpire name:05 20000 //20000毫秒(20S)后过期
expire name:06 -2 //直接过期,和del一样
设置键在某个时间点过期 使用的是时间戳
expireat name:04 1516971599 //设置在2018/01/27 20:59:59过期
时间转时间戳:网址http://tool.chinaz.com/Tools/unixtime.aspx
hset user:01 name james //初始化数据
expire user:01 60 //设置60S后过期
ttl user:01 //查看过期剩余时间
persist user:01 //去掉过期
ttl user:1 //返回-1 可以永久查询不失效
注意:对于字符串重设值后,expire无效,
set name james
expire name 50
ttl name
set name james1 //此时expire取消
ttl name //返回-1, 长期有效
键的迁移
把部分数据迁移到另一台redis服务器
1, move key db //reids有16个库, 编号为0-15
set name james1; move name 5 //迁移到第6个库
select 5 ;//数据库切换到第6个库, get name 可以取到james1
这种模式不建议在生产环境使用,在同一个reids里可以玩
2, dump key;
restore key ttl value//实现不同redis实例的键迁移,ttl=0代表没有过期时间
例子:在A服务器上 192.168.1.111
set name james;
dump name; // 得到"\x00\x05james\b\x001\x82;f\"DhJ"
在B服务器上:192.168.1.118
restore name 0 "\x00\x05james\b\x001\x82;f\"DhJ"
get name //返回james
3,migrate指令迁移到其它实例redis,在1.111服务器上将test移到118
migrate | 192.168.1.118 | 6379 | test | 1000 | copy | replace | keys | |
指令 | 要迁移的目标IP | 端口 | 迁移键值 | 目标库 | 超时时间 | 迁移后不删除原键 | 不管目标库是不存在test键都迁移成功 | 迁移多个键 |
键的遍历
redis提供了两个命令来遍历所有的键
1,键全量遍历:
mset country china city bj name james //设置3个字符串键值对
keys * //返回所有的键, *匹配任意字符多个字符
keys *y //以结尾的键,
keys n*e //以n开头以e结尾,返回name
keys n?me // ?问号代表只匹配一个字符 返回name,全局匹配
keys n?m* //返回name
keys [j,l]* //返回以j l开头的所有键 keys [j]ames 全量匹配james
考虑到是单线程, 在生产环境不建议使用,如果键多可能会阻塞,如果键少,可以
2,渐进式遍历
mset a a b b c c d d e e f f g g h h i i j j k k l l m m n n o o p p q q r r s s t t u u v v w w x x y y z z //初始化26个字母键值对
字符串类型:
scan 0 match n* count 20 //匹配以n开头的键,取20条,第一次scan 0开始
第二次从游标10开始取20个以n开头的键,相当于一页一页的取,当最后返回0时,键被取完
注:渐进式遍历可有效地解决keys命令可能产生的阻塞问题
除scan字符串外:还有以下
SCAN 命令用于迭代当前数据库中的数据库键。
SSCAN 命令用于迭代集合键中的元素。
HSCAN 命令用于迭代哈希键中的键值对。
ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
用法和scan一样
7.redis数据库管理
select 0 //共16个库, 0 --15, select切换数据库
set name james
select 1
get name //隔离了,取不到,和mysql不同库一样
其中redis3.0以后的版本慢慢弱化了这个功能,如在redis cluster中只允许0数据库
原因:
1,redis单线程,如果用多个库,这些库使用同一个CPU,彼此会有影响
2,多数据库,调试与运维麻烦,若有一个慢查询,会影响其它库查询速度
3,来回切换,容易混乱
flushdb: 只清空当前数据库的键值对 dbsiz 0
flushall: 清空所有库的键值对 (这两个指令慎用!!!!)