Redis数据类型及常用操作
一、Redis键(Key)
#http://doc.redisfans.com/key/index.html #关于key的所有指令
1.1 查看key
#http://doc.redisfans.com/key/keys.html #关于KEYS命令的常用操作及举例
> KEYS * #KEYS *,匹配数据库中所有 key 。
> KEYS k* #匹配所有以k开头的key
> KEYS k?y* #匹配所有“k中间是一个任意字符y"开头的key
> KEYS k[1|ey]* #匹配所有k1开头或者key开头的key
#特殊符号用 \ 隔开
> EXISTS k1 #查看k1键是否存在,存在返回(integer) 1,不存在返回(integer) 0。
> RANDOMKEY #从当前数据库中随机的返回一个key,数据库不为空就返回一个key,如果数据库为空就返回nil。
> TYPE k2 #返回k2所储存的值得类型,none (key不存在)string (字符串)list (列表)set (集合)zset (有序集)hash (哈希表)
> SORT num_01 #对num_01里面的值(列表里面要是整数)进行排序,是升序。
> SORT num_01 DES #对num_01进行降序排序。
1.2 删除移动key
> DEL k3 #删除一个名字叫做k3的key,key存在就返回(integer) 1,删除的key不存在就返回(integer) 0。
> DEL k2 k3 k4 #同时删除k2,k3,k4,同时删除多个key,key之间用空格隔开。因为我们上面已经删除了k3,所以如果K2和k4存在的话应该返回(integer) 2
> MOVE k1 1 #将k1从当前的库移到1号库,如果当前的库没有k1,则返回(integer) 0。当1号库也存在k1的时候,操作也是失败的。
1.3 给key设置过期时间
> EXPIRE cache_page 30 #给一个叫cache_page的key设置过期时间为30秒。
> TTL cache_page #查看cache_page这个key还剩多少秒过期。如果还没过期显示正数,过期了显示-2.
> EXPIRE cache_page 3000 #如果上面的cache_page还没过期呢,再执行一次新的过期设置会替代旧的过期设置。如果已经过期了,运行这句话就失效了。要重新set 定义这个叫做cache_page的key,过期时间设置才能生效。
> EXPIREAT cache_page 1499616000 #这里是指定cache_page的过期时间是2017年7月10号。EXPIREAT指定的是unix时间戳。
> PEXPIRE cache_page 150000 #设置了cache_page的过期时间是150000毫秒。
> PTTL cache_page #查看精确到毫秒,还有多久过期。
> PERSIST cache_page #移除cache_page的过期时间,让其永不过期。用TTL查看返回的是-1,就表示永不过期。
1.4 修改key的名称
> RENAME cache_page pages #将cache_page改名为pages,如果cache_pages不存在则提示(error) ERR no such key。如果要替换成的新key已经存在则替换掉。
> RENAMENX K1 k2 #当k2这个key不存在的时候,K1才能将名称更换成k2。
博文来自:www.51niux.com
二、String(字符串)
参考:http://doc.redisfans.com/string/index.html
2.1 设置key值
> set user chaishao #设置一个key的名称为user,键值为chaishao.如果user键已经存在就会覆盖其值。
> set user shaoye NX #只有键user不存在的时候才会进行设置操作(NX的作用。)等同于SETNX key value.
> set user shaoye XX #只有键user存在的时候才会进行设置操作。
> set user shaoye EX 30 #设置user键的过期时间为30秒,效果等同于SETEX key second value.
> set user shaoye PX 30000 #设置名称为user的键的过期时间为30000毫秒。效果等同于PSETEX key millisecond value.
> set user2 shaoye EX 300 NX #EX和NX还可以混合使用
> MSET date "2017.06.20" time "21:42 am" #可以设置多个值,设置了date键值为“2017.06.20”time键值为"21:42 am"
> MSETNx date "2017.06.20" time "21:44 am" #添加的键都不存在才会设置成功,MSETNX 是原子性的。
> GETSET date "2017.06.21” #给指定的key设置value,并显示key的旧值。这种键不存在则设置失败。
> APPEND user2 "-110” #如果user2不存在,user2的值就是-110,如果user2存在,就是原来的尾部追加上-110。
> SETRANGE empty_string 5 "Redis!" #用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。如果empty_string不存在所得到的结果就是:"\x00\x00\x00\x00\x00Redis!" #不足的空位用\x00填充。如果键值存在切长度构成,就会从第五个位置开始替换为Redis!,如"2017.Redis!"
2.2 获取key值
> get date #获取date键的值
"2017.06.20"
> MGET date time #获取多个键值
1) "2017.06.21"
2) "21:42 am"
> STRLEN date #返回key所存储的字符串值得长度,如果键不存在则返回0.
> GETRANGE date 0 3 #取一个键值得范围,这里是0-3,也就是0、1、2、3,负数偏移量表示从字符串最后开始计数, -1 表示最后一个字符, -2 表示倒数第二个,以此类推。 0 -1 # 从第一个到最后一个, -1 -5 # 不支持回绕操作显示为"",值域范围不超过实际字符串,超过部分自动被忽略。
"2017"
2.3 对值是数字的键做操作
> INCR keynum #如果key值不存在,那么key的值会先被初始化为0然后再执行INCR操作。如果存在就将key中储存的数字值加1。
> INCRBY keynum 20 #当keynum不存在的时候就是先初始化为0然后加20,如果存在就是在值得基础上加20.
> INCRBYFLOAT keynum 20.22 #为key所存储的值加上浮点数,当然也可以是整数, INCRBYFLOAT 的计算结果也最多只能表示小数点的后十七位。
> DECRBY keynum 20 #为keymum所存储的数字减20。这个存储的数字必须是整数。
> DECR keynum #每次为keynum所存储的数字减1,这个存储的数字必须是整数。
三、List(列表)
#http://doc.redisfans.com/list/index.html
3.1 列表的添加
> RPUSH mylist1 a b c #将一个或多个值 value 插入到列表 key 的表尾(最右边)。当 key 存在但不是列表类型时,返回一个错误。
> RPUSHX mylist1 1 #将单个值value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表。当 key 不存在时, RPUSHX 命令什么也不做。
> LPUSH mylist1 0 1 2 #将一个或多个值value插入到列表key的表头(最左边)。当 key 存在但不是列表类型时,返回一个错误。
> LPUSHX mylist1 0 #将单个值value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。当 key 不存在时, LPUSHX 命令什么也不做。
> LINSERT mylist1 BEFORE "a" "hello" #在mylist1列表的a值前面加入hello字段。当指定的匹配值不存在于列表 key 时,不执行任何操作。当 key 不存在时, key 被视为空列表,不执行任何操作。如果 key 不是列表类型,返回一个错误。
> LINSERT mylist1 AFTER "a" "buhao" #在mylist1列表的a值后面加入buhao字段。如果命令执行成功,返回插入操作完成之后,列表的长度。如果没有找到指定的匹配值,返回 -1 。如果 key 不存在或为空列表,返回 0 。
> LSET mylist1 4 "nidaye" #将mylist1的索引下表是4的值设置为"nidaye"。当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。
3.2 列表的查看
> LINDEX mylist1 4 #返回mylist1列表中下表是4的元素。不能指定范围,只能制定单一下标。下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。如果 key 不是列表类型,返回一个错误。
"nidaye"
> LLEN mylist1 #返回mylist1列表的长度。如果 key 不存在,则 key 被解释为一个空列表,返回 0 .如果 key 不是列表类型,返回一个错误。
> LRANGE mylist1 0 -1 #显示一个列表指定区间内容的元素,这里区间以偏移量0(start)和-1(stop)指定。
3.3 删除列表里面的内容
> LPOP mylist1 #返回并删除mylist1列表key的头元素。
> RPOP mylist1 #返回并删除mylist1列表key的尾元素。
#RPOPLPUSH source destination #source列表的尾部跑到destination列表的头部。#http://doc.redisfans.com/list/rpoplpush.html
> BRPOPLPUSH mylist mylist1 99994 #把mylist里面的索引下标99994的元素弹出来调到mylist1的头部。
> BRPOP mylist1 #将mylist1列表尾部的元素弹出并删除。
> BLPOP mylist1 #将mylist1列表头部的元素弹出并删除。
> RPOP mylist1 #将mylist1列表尾部的元素返回并删除。
> LPOP mylist1 #将mylist1列表头部的元素返回并删除。
> LREM mylist1 2 b #移除mylist1表里面从头到尾,前两个b。 0 b就表示移除所有的b。-1 b 就表示从尾向头第一个b。
> LTRIM mylist1 2 5 #保留下标2到5之间的元素。让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。当 key 不是列表类型时,返回一个错误。0 -1列表将被清空。
博文来自:www.51niux.com
四、set(集合)
4.1 向集合添加元素
> SADD bbs "tianxia" "buda" "baidu" #将一个或多个member元素写入到集合key中,如果member元素存在将被忽略。
4.2 集合的数量
> SCARD bbs #如果集合里面有内容就返回member元素的个数,如果集合不存在或里面是空的返回0.
> SINTER bbs #返回集合里面的内容
> SINTER bbs blog #但是有多个key就不一样了,现在集合的交集
> SMEMBERS bbs #返回集合中的所有成员,不存在的key被视为空集合。
> SDIFF bbs blog #这个就是先求出bbs和blog的交集,然后返回bbs里面除交集内容以外的元素,谁在前谁是被匹配的那个key。
> SDIFFSTORE bbs_diff_blog bbs blog #这就是将SDIFF的结果存放在指定的一个key里面,如果里面有内容就会被覆盖。这里存放到了bbs_diif_blog
> SINTERSTORE bbs_and_blog bbs blog #这就是将bbs和blog两个集合的交集存入到bbs_and_blog中,如果里面存在值则替换。
> SISMEMBER bbs "sina" #判断"sina"是否是bbs的元素,是就返回1,不是就返回0。
> SRANDMEMBER bbs #返回bbs集合中的一个随机元素。
> SUNION bbs blog #返回bbs和blog集合的并集也就是返回他们两个集合中的所有元素。
> SUNIONSTORE bbs_or_blog bbs blog #将bbs和blog集合的并集存放到bbs_or_blog集合中。
#注意上面提到的并集、差集、交集,都支持多个集合。
4.3 操作集合中的元素
> SMOVE bbs blog "sohu" #将bbs中的"sohu"元素移动到blog集合中。如果"sohu"元素存在就返回1,如果不存在或者bbs集合不存在就返回0.
> SPOP bbs #随机返回并删除bbs集合中的一个元素
> SREM bbs "buda" "baidu" #移除bbs集合中指定的元素,不存在的元素会被忽略,如果移除成功下面会显示移除的个数。
五、Hash
hash就是KV模式不变,但V是一个键值对。
5.1 创建一个hash
> HSET website baidu "www.baidu.com" #创建一个叫做website的哈希表key。中的域baidu的值是www.baidu.com.还可以设置其他域。
> HMSET website sina "www.sina.com" yahoo "www.yahoo.com" #同时设置多个field-value(域-值),域存在就会被覆盖。成功返回OK。
> HSETNX website sina "www.sina.cn" #将website哈希key中的sina的值设置为www.sina.com,如果域存在则操作无效,只有域不存在的时候才有效。
5.2 查看hash表
> HEXISTS website sina.cn #查看website哈希表key中,是否存在sina.cn域,如果存在返回1,不存在返回0.
> HGET website sina.cn #返回哈希表key中sina.cn域的值。
> HGETALL website #返回哈希表key中所有的域和域的值,域在上值在下。
> HKEYS website #返回哈希表中所有的域
> HVALS website #返回哈希表中所有域的值。
> HLEN website #返回website哈希表key中域的数量。
6.3 删除hash表key中的域
> HDEL website goole #删除website哈希表key中的goole域,可以删除多个域,多个域之间用空格隔开。
6.4 hash表key中设置增量
> HINCRBY website pagenum 200 #首先pagenum得值要是个整数不然执行报错,如果pagenum域不存在,这里就是添加pagenum域并为其赋值200.如果pagenum域的值已经存在,则这里就是原来的值加200.
> HINCRBY website pagenum -50 #当然也可以指定负数,那400-50就是350.
> HINCRBYFLOAT website pagenum 4.5 #这就是浮点数的增量
六、Zset有序集合(SortedSet)
#http://doc.redisfans.com/sorted_set/index.html
6.1 创建一个有序集合
> ZADD page_rank 8 bing.cn #8是score的值,score值可以是整数值或双精度浮点数。后面的bing.cn是集合的member。
> ZADD page_rank 9 baidu.com 8 bing.com #可以添加多个score和member。如果member已经存在但是score值不同则会覆盖掉旧的score
6.2 查看Zset集合
> ZCARD page_rank #返回page_rank序集key的基数。
> ZCOUNT page_rank 0 8 #返回page_rank中score值在0(min)到8(max)的成员数量。
> ZRANGE page_rank 0 -1 #返回指定区间内的成员,这里是所有。其中成员的位置按 score 值递增(从小到大)来排序。具有相同 score 值的成员按字典序(lexicographical order )来排列。下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
> ZRANGE page_rank 0 1 WITHSCORES #可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,不然只返回member。
> ZREVRANGE page_rank 0 -1 WITHSCORES #ZREVRANGE是让score值递减(从大到小)来排序。
#ZRANGEBYSCORE #所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
#ZREVRANGEBYSCORE #这个也是区间,跟上面不同的是是递减。
> ZRANK page_rank bing.cn #这里是显示bing.cn的排名。排名以0为底,也就是说score 值最小的成员排名为 0 。其中有序集成员按 score 值递增(从小到大)顺序排列。
> ZREVRANK page_rank bing.cn #正好是递减,上面排位最低的在这里是排名最高的。
> ZSCORE page_rank bing.cn #返回bing.cn元素的score值。
6.3 Zset值增量
> ZINCRBY salary 2000 tom #格式是ZINCRBY key increment member。这是定义了一个工资的集合,然后为tom的键增加了一个2000的值。也可以是负数值。score 值可以是整数值或双精度浮点数。
6.4 Zset删除成员
> ZREM page_rank baidu.com bing.com #可以删除一个或多个成员之间用空格隔开,元素不存在返回0,删除了几个就返回几个数。
> ZREMRANGEBYRANK page_rank 0 1 #移除有序集key中指定排名区间内的所有成员,这里是删除0-1之间的成员,0表示第一个成员。
> ZREMRANGEBYSCORE page_rank 2 4 #移除page_rank有序集中,score值之间大于并等于2小于并等于4的成员。
6.5 Zset有序集的交集和并集
下面两个参数在线文档说的比较详细:
#ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] #并集
#ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] #交集
博文来自:www.51niux.com
七、INFO信息查看
文档链接:http://doc.redisfans.com/server/info.html
127.0.0.1:6379> info
# Server #一般Redis服务器信息,包含以下域
redis_version:3.2.9 #redis服务器版本
redis_git_sha1:00000000 #git SHA1
redis_git_dirty:0 #git dirty flag
redis_build_id:981e5dd19fd02099 #redis的build_id
redis_mode:standalone #redis的运行模式,这里是单机不是集群(cluster)
os:Linux 2.6.32-358.el6.x86_64 x86_64 #redis服务器的宿主机操作系统
arch_bits:64 #架构(32位还是64位)
multiplexing_api:epoll #Redis 所使用的事件处理机制
gcc_version:4.4.7 #gcc版本
process_id:2753 #redis服务器的进程ID
run_id:08b8effd5d82c8c99edef99259f282aa76dba5a1 #Redis 服务器的随机标识符(用于 Sentinel 和集群)
tcp_port:6379 #tcp/ip监听端口
uptime_in_seconds:15 #子redis服务器启动以来,经过的秒数
uptime_in_days:0 #自redis启动以来经过的天数
hz:10 #redis内部调度(进行关闭timeout的客户端,删除过期key等等)频率,程序规定serverCron每秒运行10次
lru_clock:5314336 #自增的时钟,用于LRU管理,该时钟100ms(hz=10,因此每1000ms/10=100ms执行一次定时任务)更新一次.
executable:/root/redis-server
config_file:
# Clients #已连接客户端信息,包含以下域
connected_clients:1 #已连接客户端的数量(不包括通过从属服务器连接的客户端)
client_longest_output_list:0 #当前连接客户端当中,最长的输出列表,用client list命令观察omem字段最大值client_biggest_input_buf:0 #当前连接客户端当中,最大的输入缓存.用client list命令观察qbuf和qbuf-free两个字段最大值blocked_clients:0 #正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
# Memory #内存信息,包含以下域
used_memory:1330504 #由 Redis 分配器分配的内存总量,以字节(byte)为单位
used_memory_human:1.27M #以人类可读的格式返回 Redis 分配的内存总量
used_memory_rss:5955584 #从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)这个值和 top、ps 等命令的输出一致used_memory_rss_human:5.68M #这个就是把上面的的字节转换成MB
used_memory_peak:1330504 #Redis 的内存消耗峰值(以字节为单位)
used_memory_peak_human:1.27M #以人类可读的格式返回redis内存消耗的峰值
total_system_memory:1036849152 #操作系统本身的内存大小
total_system_memory_human:988.82M #操作系统内存大小转换成可读的方式
used_memory_lua:37888 #Lua 引擎所使用的内存大小(以字节为单位)
used_memory_lua_human:37.00K #将上面转换成可读的方式
maxmemory:0 #redis使用内存的上限,这里是没有设置。一般是要设置的。
maxmemory_human:0B #上面的字节转换成可读的形式
maxmemory_policy:noeviction #内存不足时候的清除策略。
mem_fragmentation_ratio:4.48 #used_memory_rss和used_memory之间的比率,小于1表示使用了swap,大于1表示碎片比较多mem_allocator:jemalloc-4.0.3 #在编译时指定的redis所使用的内存分配器。可以是libc、jemalloc或者tcmalloc
# Persistence #持久化的相关信息
loading:0 #服务器是否正在载入持久化文件
rdb_changes_since_last_save:0 #距离最近的一次持久化,有多少个个写入命令没有持久化
rdb_bgsave_in_progress:0 #服务器是否正在创建rdb文件
rdb_last_save_time:1498486545 #离最近一次成功创建rdb文件的时间戳。当前时间戳 - rdb_last_save_time=多少秒未成功生成rdb文件rdb_last_bgsave_status:ok #最近一次持久化是否成功
rdb_last_bgsave_time_sec:-1 #最近一次生成rdb文件的秒数
rdb_current_bgsave_time_sec:-1 #如果服务器正在创建rdb文件,那么这个域记录的就是当前的创建操作已经耗费的秒数
aof_enabled:0 #是否开启了aof,这里0是未开启
aof_rewrite_in_progress:0 #标识aof的rewrite操作是否在进行中
aof_rewrite_scheduled:0 #rewrite任务计划,当客户端发送bgrewriteaof指令,如果当前rewrite子进程正在执行,那么将客户端请求的bgrewriteaof变为计划任务,待aof子进程结束后执行rewrite 。
aof_last_rewrite_time_sec:-1 #最近一次aof rewrite耗费的时长
aof_current_rewrite_time_sec:-1 #如果rewrite操作正在进行,则记录所使用的时间,单位秒
aof_last_bgrewrite_status:ok #上次bgrewrite aof操作的状态
aof_last_write_status:ok #最近一次aof的写入状态
# Stats #一般统计信息
total_connections_received:1 #新创建的连接个数
total_commands_processed:1 #redis处理的命令个数
instantaneous_ops_per_sec:0 #redis当前的qps,redis内部较实时的每秒执行的命令数。
total_net_input_bytes:31 #redis网络入口流量字节数
total_net_output_bytes:6035691 #redis网络出口流量字节数
instantaneous_input_kbps:0.00 #redis网络入口kps
instantaneous_output_kbps:0.00 #redis网络出口kps
rejected_connections:0 #拒绝的连接个数,redis连接个数达到maxclients限制,拒绝新连接的个数
sync_full:0 #主从完全同步成功次数
sync_partial_ok:0 #主从部分同步成功次数
sync_partial_err:0 #主从部分同步失败次数
expired_keys:0 #运行以来过期的key的数量
evicted_keys:0 #运行以来剔除(超过了maxmemory后)的key的数量
keyspace_hits:0 #命中次数
keyspace_misses:0 #没命中次数
pubsub_channels:0 #当前使用中的频道数量
pubsub_patterns:0 #当前使用的模式的数量
latest_fork_usec:0 #最近一次fork操作阻塞redis进程的耗时数,单位微秒
migrate_cached_sockets:0
# Replication #主从信息,这里是master上显示的信息
role:master #实例的角色
connected_slaves:0 #连接的slave实例个数
master_repl_offset:0 #主从同步偏移量,此值如果和上面的offset相同说明主从一致没延迟
repl_backlog_active:0 #复制积压缓冲区是否开启
repl_backlog_size:1048576 #复制积压缓冲大小
repl_backlog_first_byte_offset:0 #复制缓冲区里偏移量的大小
repl_backlog_histlen:0 #此值等于 master_repl_offset - repl_backlog_first_byte_offset,该值不会超过repl_backlog_size的大小
# CPU #CPU计算量统计信息
used_cpu_sys:0.17 #Redis服务器耗费的系统 CPU。
used_cpu_user:0.17 #Redis服务器耗费的用户CPU 。
used_cpu_sys_children:0.00 #后台进程耗费的系统 CPU。
used_cpu_user_children:0.00 #后台进程耗费的用户 CPU。
# Cluster
cluster_enabled:0 #一个标志值,记录集群功能是否已经开启。
# Keyspace #keyspace 部分记录了数据库相关的统计信息,比如数据库的键数量、数据库已经被删除的过期键数量等。db0:keys=23,expires=0,avg_ttl=0
db1:keys=3,expires=0,avg_ttl=0
更多redis的常用操作命令:http://doc.redisfans.com/server/index.html