一、单个键管理
针对单个键的命令,有type、del、object, exists, expire等,下面介绍几个重要的
键的重命名
Rename key newkey
192.168.1.10:6379> set python jedis
OK
192.168.1.10:6379> get python
"jedis"
192.168.1.10:6379> rename python java
OK
192.168.1.10:6379> get python
(nil)
192.168.1.10:6379> get java
"jedis"
随机返回一个键
Randomkey
192.168.1.10:6379> randomkey
"a"
192.168.1.10:6379> randomkey
"user:1_2:inter"
dbsize查看多少个键
192.168.1.10:6379> dbsize
(integer) 24
键过期
expkeat时间戳按秒换算的时间戳
192.168.1.10:6379> expireat hello 1469980800
(integer) 1
192.168.1.10:6379> expire not_exist_key 30
(integer) 0
192.168.1.10:6379> set hello world
OK
192.168.1.10:6379> expire hello -2
(integer) 1
192.168.1.10:6379> get hello
(nil)
tt値:大于等于0的整数:键剩余的过期时间
-1:键没有设置过期时间
-2:键不存在
迁移键
Move
Dump + restore
Migrate
Move
Move key db用redis库和库内部进行迁移0-15个库
Dump + restore
Dump key和restore key ttl value多个red is之囘进行数据迁移分2步:
1、在Bredis, dump序列化备份,格式rdb
2、在目标redis上,restore将上面序列化的值进行复原,ttl过期时间ttl=O没有过期时间
.
注意:
1整个迁移过程并非原子性
2迁移的过程开启了两个客户端连接
源redis :
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> dump hello
"\x00\x05world\b\x00\xa0\xfc\xd0;y\xb0\xf8\xfa"
目标redis
127.0.0.1:6379> select 15
OK
127.8.0.1:6379[15]> restore hello 0"\x00\x05world\b\x00\xa0\xfc\xd0;y\xb0\xf8\xfa"
OK
Migrate
3 0.6版本以后的才有,3.0.6版本之前的没有
Dump+restore+del
具有原子性Migrate host port key | “ ” destination-db timeout [copy] [replace] [keys key[key..]]
Host 目标 redis 的ip
Port目标redis的端口
Key|" "迁移的键,可以是多个键
Destination-db目标redis的数据库的索引(索引就是数据库的编号0-15)
Timeout迁移的超时时间(单位为毫秒)
[copy]迁移后并不删除原数据
[Replace]如果使用replace, migrate不管目标redis是否存在该键都会正常迁移进行数据覆盖(迁移多个键时, 把replace放在keys前面)
[keys key[key..]表示迁移多个键,多余迁移1个键的写这里
命令 | 作用域 | 原子性 | 是否支持多个键 |
---|---|---|---|
Move | redis内部 | 有 | 不支持 |
Dump+restore | redis之间 | 没有 | 不支持 |
Migrate | redis之间 | 有 | 支持 |
遍历键
Keys patten
Keys *
192.168.1.10:6379> keys *
1) "c"
2) *user: 1: follow1'
3) "listkey"
4) "user:ranking:l_union_2*’
5) "hashkey"
6) "myset"
7) "user:ranking:1M
8) "key"
9) "a"
'匹配任意字符
?匹配1个字符
[]匹配部分宇符[1,3]代表1和3
[1-10]代表1到10的任意数字
\x用来做转义
以j或r开头edis结尾的键
有3种情况使用keys
1、不对外提供服务的redis节点上
2、确认键值总数数是较少,可以用keys
3、用scan防止阻塞
scan
渐进式的遍历2.8版本才有,相当于1个keys = 多个scan
Scan cursor [match pattern] [count number]
C ursor实际上curso「是一个游标,第一次遍历从0开始,每次scan遍历完都会返回当前游标的值,直到游标的值 为0,表示遍历结束
[match pattern]可选项,作用是做模式的匹配
[count number]可选项,作用是表明每次要遍历的键的个数,默认是10个
Scan 0开始
缺点:Scan不能保证完整的遍历出所有的键
192.168.1.10:6379> scan 0
1) "30"
2) 1) "user:ranking:l_union_2"
2) "user:1_2:interM
3) "c”
4) "user:1:follow"
5) "myset"
6) "zsetkey"
7) "b"
8) "user:ranking:2"
9) "user:ranking:1_inter_2"
10) "user:ranking”
192.168.1.10:6379> scan 30
1) "23"
2) 1) "d"
2) "mylist"
3) "zhangyi"
4) "user:2:follow"
5) "a"
6) "listkey"
7) "user:ranking:1"
8) "key"
9) "setkey"
10) "hashkey"
192.168.1.10:6379> scan 23
1) "0”
1) "java"
2) "user:1"
3) "redis"
数据库管理
1、切换数据库
Select dblndex
192.168.1.10:6379> select 15
OK
2、flushdb/flushall
192.168.1.10:6379[15]> dbsize
(integer) 0
192.168.1.10:6379[15]> set a b
OK
192.168.1.10:6379[15]> dbsize
(integer) 1
192.168.1.10:6379[15]> flushdb
OK
192.168.1.10:6379[15]> dbsize
(integer) 0
二、小功能之慢查询分析
慢查询分析
许多存储系统(例如MySQL)提供慢查词日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查词曰志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值, 就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,Redis也提 供了类似的功能。
慢查询的两个配置参数
Slowlog-log-slower-then :预设阀值(单位:微秒,1 秒=1000毫秒=1000000微秒)
预设阀值=0 ,记彔所有
预设阀值<0 ,任何命令都不会进行记录
Slowlog-max-len :慢查词日志最多存储多少条
若慢查词曰志存满时,再有曰志记彔时,则删除最早的一条,依次按此执行
命令
(1)获取慢查词曰志
192.168.1.10:6379> slowlog get
(empty list or set)
(2)获取慢查词曰志列表当前的长度
192.168.1.10:6379> slowlog len
(integer) 0
(3)慢查词日志重置
192.168.1.10:6379> slowlog reset
OK
Redis Shell
Redis-cli详解[-r]:代表将命令执行多次
[rootglocalhost redis-4.0.2]# redis-cli -r 3 ping
PONG
PONG
PONG
[-i]:代表每个几秒执行一次命令,但是-i必须和-r-起使用
[rcotglocalhost redis-4.0.2]# redis-cli -r 5 -i 1 ping
PONG
PONG
PONG
PONG
PONG
[-x]:从标准输入(stdin)读取数据作为redis-cli的最后参数
将world作为键hello的值
[rootglocalhost redis-4.0.2]# echo "world" | redis-cli -x set hello
OK
[-c]:该选项是连接redis cluster节点时需要使用的,-c选项可以防止moved和ask异常
[-a]:动输入auth命令
[--scan]用于扫描指定模式的键
[--slave]把当前的客户端模拟当成redis节点的从节点,来获取redis节点的更新
[--pipe]用于执行流水线,将命令封装成redis通信协议定义的数据格式,批畺发送给redis执行
[--rdb]用于拍快照(ao肥快照保存在磁盘),备份,请求redis实例生成并发送RDB持久化文件,保存在本地
[--eval]执行指定的lua脚本(与魔兽世界脚本相同)
[--latency】查词延迟,包含以下3点
[--latency]该选项可以测试客户端到目标red is的网络延迟,结果只有一条
[--latency-history]分时段的形式了解延迟信息
[--latency-dist]使用统计图形式从控制台输出延迟统计信息
[--stat]选项可以实时获取redis的重要统计信息(info不是实时的)
[root@localhost redis-4.0.2]# redis-cli --stat
------data---------------------------------load-----------------child----
keys mem clients blocked requests commections
11 829.17K 2 0 136 (+0) 6
11 829.17K 2 0 136 (+1) 6
11 829.17K 2 0 136 (+1) 6
11 829.17K 2 0 136 (+1) 6
....
【redis-server详解】
[-test-memory 1024]是否有内存问题造成的内存崩溃,可以用来检测当前操作系统是否稳定的分配指定容是的内存给redis
[rootglocalhost src]# redis-server --test-memory 1024
[redis-benchmark]可以为redis做基准新能测试,为开发和运维提供方便,做测试使
[-c]代表客户端的并发量(默认50)
[-n]-n后面跟数星,代表客户端请求总畺(默认为100 000)
[-q]仅仅显示requests per second (请求数是,秒,等信息)信息
[-r]在一的redis上执行redis-benhmark,并向redis里面插入更多随机键
[-P]每个请求pipe流水线的数据畺(默认为1)
[-k]代表客户端是否使用keepalive, 1为使用,0为没试用,默认是1
Pipeline
Redis提供了批畺操作命令(例如mget, mse痒),有效地节约RTT,但大部分命令是,不支持批畺操作的,比如要执行n次hgetall命令,并没有mhgetall命令存在,需要消耗,n次RTT, Redis的客户端和服务端可能部署在不 同的机器上。比如客户端在北京,Redis服务端在上海,两地直线距离约为1300公里,那么1次RTT时间-1300 x 2/ ( 300000 x 2/3)=13毫秒(光在真空中传输速度为每秒30万公里,这里假设光纤为光速的2/3),那么客户端在1 秒内大约只能执行80次左右的命令,这个和Redis的高并发高吞吐特性背道而驰。
Pipeline (流水线肌制能改善上面这类问题。它能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将 这组Redis命令的执行结果按顾序返回给客户端。
事务
为了保证多条命令组合的原子性,Redis提供了简单的事务功能以及集成Lua脚本来解决这个问题。本节首先简 单介绍Redis中事务的使用方法以及它的局限性,之后重点介绍Lua语言的基本使用方法。
熟悉关系型数据库的同学应该对事务比较了解,简单地说,事务表示一组动作,要么全部执行,要么全部不执 行。比如在社交网站上用户A关注了用户B,那么需要在用户A的关注表中加入用户B,并且在用户B的粉丝表中添加用户A,这两个行为要么全部执行,要么全部不执行,否则会出现数据不一致的情况。
Redis提供了简单的事务功能,将一组需要一起执行的命令放到multi和exec两个命令之间。multi命令代表事务开 始,exec命令代表事务结束,它们之间的命令是原子顺序执行的,例如下面操作实现了上述用户关注问题。
192.168.1.10:6379> multi
OK
192.168.1.10:6379> sadd user:a:follow user:b
QUEUED
192.168.1.10:6379> sadd user:b:follow user:a
QUEUED
可以看到sadd命令此时的返回结果是QUEUED,代表命令并没有真正执行,而是暂时
保存在Redis中。如果此时另一客户端执行sismember user :a: follow user:b返回结果应该为0。
192.168.1.10:6379> sismeinber user:a:follow user:b
(integer) 0
只有当exec执行后,用户A关注用户B的行为才算芫成。
192.168.1.10:6379> multi
OK
192.168.1.10:6379> sadd user:a:follow user:b
QUEUED
192.168.1.10:6379> sadd user:b:follow user:a
QUEUED
192.168.1.10:6379> exec
1) (integer) 1
2) (integer) 1
192.168.1.10:6379> sismember user:e:follow user:b
(integer) 1
如果要停止事务的执行,可以执行discard命令代替exec命令
192.168.1.10:6379> discard
OK
192.168.1.10:6379> sismember user:a:follow user:b
(integer) 0
Bitmaps
数据结构模型
现代计算机用二进制(位)作为信息的基确单位,1个字节等于8位,例知"big”宇符串是由3个字节组成,但实际在 计算机存储时将其用二进制表示,,"big"分别对应ASCII码分别是98、105、103,对应的二进制分别是 0110010、01101001 和0110011。
所以
Big有3个字节
B98 01100010
I 105 01101001
G 103 01100111
许多开发语言都提供了操作位的功能,合理地使用位能够有效地提高内存使用率和开发效率。Redis提供了 Bitmaps这个“数据结构”可以实现对位的操作。把数据结构加上引号主要因为:
Bitmaps本身不是一种数据结构,实际上它就是宇符串,但是它可以对宇符串的位进行操作。 Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。可以把Bitmaps想象 成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移畺。
命令
1、设置值
设置值Setbit key offest value
192.168.1.10:6379> setbit unique:user:2000-01-01 0 1
(integer) 0
2、获取值 getbit key offest
192.168.1.10:6379> getbit unique:user:2000-01-01 0
(integer) 1
3、获取bitmaps指定范围值为1的个数
Bitcount [start] [end]
Start和end代表起始和结束字节数
192.168.1.10:6379> bitcount unique:user:2000-01-01 0 10
(integer) 1
4、Bitmaps间的运算Bitop op destkey key [key ...]
Bitop是一个复合操作,他可以做多个bitmaps的and (交集),or併集),not (非),xor (异或)操作比ing 讲结果保存在destkey中
5、计算Bitmaps中第一直为targetBit的偏移量 Bitpos key targetBit [start] [end]
HyperLogLog
HyperLogLog并不是一种新的数据结构(实际类型为字符串类型>,而是一种基数算法,通过HyperLogLog可以利 用极小的内存空间完成独SZ总数的统计,数据集可以是IP、Email. ID等。HyperLogLog提供了3个命令: pfadd, pfcount, pfmerge,比如2016-03-06的访问用户是uuid-1, uuid-2, uuid-3, uuid-4, 2016-03-05的访 问用户是uid-4, uuid-5, uuid-6, uuid-7.
1、添加
Pfadd key element [element...] pfadd用于向HyperLogLog添加元素
192.168.1.10:6379> pfadfl 2016_03_06:ur>ique:ids "uuid-1" "uuid-2"
(integer) 1
2,计算独立用户数
Pfcount key [key. ..]用于计算一个或多个HyperLogLog的独立总数
192.168.1.10:6379> pfcount 2016_03_06:unique:ids
(integer) 2
3、合并
pfrnerge destkey sourcekey [sourcekey . ] pfmerge可以求出多个HyperLogLog的并集并赋值给 destkey
192.168.1.10:6379> pfcount 2016_03_05_06:unique:ids
(integer) 0
发布订阅
Redis提供了基于"发布/订阅'模式的消息机制,此种模式下,消息发布者和订阅者不 进行亘接通信,发布者客户端向指定的频道(channel)发布消息,订阅该频道的每个客户端都可以收到该消息。
命令
1、发布消息
publish channel message
2、订阅消息
192.168.1.10:6379> subscribe channel [channel...]
3、取消订阅
192.168.1.10:6379> unsubscribe [channel [channel...]]
4、按照模式订阅和取消订阅
192.168.1.10:6379> psubscribe [pattern [pattern . ..]]
192.168 1.10:6379> punsubscribe [pattern [pattern +_+]]
5、查询订阅
(1)、查看活跃的频道数
192.168.1.10:6379> pubsub channel [argument [argument...]]
(2)、查看频道订阅数
192.168.1.10:6379> pubsub numsub [argument [argument.]]
(3)、查看模式订阅数
192 168 1.10:6379> pubsub numpat [argument [argument...]]
GEO
Redis 3.2版本提供了GEO (地理信息定位)功能,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依 赖于地理位置信息的功能,对于需要实现这些功能的开发者来说是一大福昔。GEO功能是Redis的另一位作者 Mat Stancliff借鉴NoSQL数据库Ardb实现的,Ardb的作者来自中国,它提供了优秀的GEO功能,
1、增加地理位置的信息
Geoadd key longitude latitude member
2、获取地理位置的信息
Geopos key memberl member2
3、获取2个地理位置的距离
Geodist key memberl member2 [unit] unit取值范围:m米|km公里|mj英里|ft尺
4、获取指定位置范围内的地理信息位置集合
(1) 以经S度返回的信息
Georadius key longitude latitude randiusm|ft|mi [withcoord] [withdist] [wothhash] [COUNT count] [asc|desc] [store key] [storedist key]
(2) 以城市名返回的信息
Georadiusbymember key longitude latitude randiusm|ft|mi半径带单位[withcoord]返回的结果中包含经纬度
[withdist]返回的结果中包含离中心节点位置的距离[wothhash] [COUNT count]指定返回结果的数星[asc|desc] 离中心节点的距离升序或降序[store key] [storedist key]返回的结果离中心节点的距离保存到指定的键当中
randiusm|ft|mi半径带单位
[withcoord]返回的结果中包含经抹度
[withdist]返回的结果中包含离中心节点位置的距离
[wothhash]获取geohash :将二维的经讳度转换为一堆的字符串
[COUNT count]揩定返回结果的数畺
[asc|desc]离中心节点的距离升序或降序
[store key] [storedist key] 一起的,返回的结果离中心节点的距离保存到指定的键当中
5、获取geohash
将二维的经讳度转换为一维的字符串
(字符串越长,地理位置越精确,宇符串越接近,地理位置越接近)
Geohash key member [member.….]
算出的结果是zset类型:
type cilies:locations