Redis的物种5种数据类型
exists key_name
del key_name
type key_name #用来返回键对应的数据类型
redis所有的redis命令都是原子操作。
set key_name value; get key; incr key_name;#如果键值不存在,则默认为0,增加后是1.; incrBy key incre_num; DECR key, DECRBY key dec_num;
INCRBYFLOAT key incremnt; APPEND key value#追加值,返回追加后字符串的长度。; STRLEN
MSET key1 val1 key2 val2 ...#同时得到或者设置多个值。
MGET key1 key2
GETBIT key offset ; SETBIT key offset value; 得到位,如果超过总位数,则默认为0.如果设置的超过了总位数,
BITCOUNT key #得到值不是0的二进制位个数
BITCOUNT key start end #统计范围内的二进制位个数
BITOP AND/OR/XOR/NOT destkey key1 key2 ... #对多个字符串键进行位运算。
HSET key field value; HGET key field; #可以用来插入和更新操作。
HMSET key field value [field value] ...
HMGET key field [field ...]
HGETALL key
HEXISTS key field #判断一个字段是否存在。
HSETNX key field value #如果字段已经存在,HSETNX命令将不执行任何操作。
HINCRBY key field increment #使字段增加指定的整数。如不存在,则自动建立并设置为0.
HDEL key field [field ...] #删除一个或多个字段,返回删除的字段个数。
HKEYS map_key #只获取字段名字
HVALS map_key #只获取字段值
HLEN map_key #获取字段数量
LPUSH key value [ value ...] #想列表中增加元素,返回增加元素后列表的长度。
RPUSH key value [value ...]
LPOP key
RPOP key
LLEN
LRANGE key start stop #获得列表中的某一个片段。返回值区间[start,stop],负数表示从右数第几个元素。start>stop,return null;
#stop大于实际的索引范围,则会返回到列表最右边的元素。
LREM key count value #删除前count个value值。cout==0, 删除所有,count>0从左删,else从右删。
LINDEX key index; LSET key index value #返回或设置指定索引的元素值。
LTRIM key start end #删除指定索引范围外的所有元素。
LINSERT key before|after pivot value #首先找到值为pivot的元素,然后在其前或后插入value
RPOPLPUSH source destination #先从source列表类型键的邮编弹出一个元素,然后放入destion的左边。
SREM key memeber [mem1...]
SMEMBERS key #返回集合中的所有元素。
SISMEMEBE key memeber
SDIFF key [ key ..] #集合的差集、交集、并集。
SINTER key [key ..]
SUNION key [key ..]
SCARD key #获取集合中元素个数。
SDIFFSTORE destination key [key ...] #diff并转储
SINTERSTORE | SUNIONSTORE
SRANDMEMBER key [count] #随机会的count个值。count>0不重复, count《0,可能重复。
SPOP #随机弹出一个元素。
ZADD key score memeber [score member ... ] #有则替换,无则增加。+inf -inf表示无穷大
ZSCORE key member
ZRANGE key start stop [WITHSCORES] 返回索引【start,stop】间的元素。后边的参数表示同时返回分数
ZREVRANGE key start stop [WITHSCORES]
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count], #可以加上(min表示不希望加上端点值。
ZINCRBY key increment member
ZCARD key #获得集合中元素的数量
ZCOUNT key min max #min和max范围内的元素个数
ZREM key member [member ...] #删除多个元素。
ZREMRANGEBYRANK key start stop #删除指定排名范围内的所有元素。
ZREMRANGEBYSCORE key min max #删除指定分数范围内的元素。
ZRANK key member #获得排名
EXEC #返回值是所有这些命令的返回值组成的列表。
#语法错误,不会执行
#运行时错误,仍然挥之难过。
UNWATCH #取消监控
EXPIRE session:29e3d 600 #10分钟后过期,返回值表示是否设置成功。
TTL key #查看某个键还有多久,返回-1表示永久存在
更精确的设置生存时间可以使用命令 PEXPIRE key millseconds。对应PTTL key
由于生存时间儿删除的键不会影响watch命令的执行。
EXPIREAT key UNIX_time #生存的截止时间。
策略有:volatile-lru :LRU算法,(只针对有生存时间的)
allkeys-lru :lRU for all
volatile-random|allkeys-random :随机删除一个键
volatile-ttl:生存时间最近的一个键 noeviction:不删除值返回错误。
SORT key [ALPHA] [DESC] #不加alpha参数的话,redis会把所有的元素转换成double来比较,
SORT key BY field #eg. SORT sortbylist BY itemscore:* desc #sortbylist是一个列表
SORT的时间复杂度是O(n+mlogm),(n是要排序的列表中元素个数,m表示要返回的元素个数。
GET参数:
SORT tag:ruby:posts BY post:*->time DESC GET post:*->title STORE destinataion #GET #会返回元素本身的值。,STORE会把结果放入目的键中。
BRPOP key1 key2 key3 timeout #阻塞时间,0表示不限制时间。如果多个键的列表中都有元素,则有限返回第一个列表。
#可以借助这个功能实现优先级队列。
SUBSCRIBE CHANNEL [CHANNEL] #只能收到后续发布的消息,之前的就收不到了。
PSUBSCRIBE 命令可以指定订阅的规则。
1)fork一个子进程。2)父进程继续执行客户端发过来的命令,而子进程开始键内存中的数据写入硬盘中的临时文件。3)子进程写入所有的数据后会用该临时文件替换掉旧的RDB文件,一次快照完成。
AOF持久化方式(append only file方式) #开启aof方式后,每执行一条会更改redis中数据的命令,redis就会将该命令写入硬盘中的aof文件。
每当达到一定条件时,redis就会自动重写aof文件。冗余的命令会被删除,重写的过程只和内存中的数据有关,和之前的aof文件无关。
(命令是先放入磁盘缓存的,一定时间后同步到硬盘上) 同步时机的选择:
appendfsync always|everysec|no #分别表示每次执行都要执行同步,每秒进行一次同步,不主动进行同步而是有操作系统没30s执行一次同步。
而一个从数据库只能有一个主。
只需要在启动服务器的过程中加上参数 --slaveof ip_of_master master_port
当一个从数据库启动后,会向煮熟库发送sync命令。煮熟库接收到sync命令后开始保存快照,并将保存期接收到的命令缓存起来。快照完成后,会将快照文件和所有缓存的命令发送给从数据库。从数据库接受到这些文件
后,载入快照并执行缓存命令。不支持断电续传。
requirepass password #设置一个密码。
通过auth password来进行认证。
错误回复以-开头,并在后边跟上错误消息,最后以\r\n结尾。
状态回复以+开头,并在后边跟上状态消息,最后以\r\n结尾。
整数回复以:开头,并在后面跟上数字,最后以\r\n结尾。
字符串回复以$开头,并在后面跟上字符串的长度,最后以\r\n结尾。然后是字符串的内容和\r\n了。
多行字符串回复以*开头,并在后面跟上字符串回复的组数,最后以\r\n结尾。然后是字符串回复的具体内容了。
b.统一请求协议
命令格式和多行字符串回复的格式很类似。
如:set Foo bar 的同意请求写法是“*3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n$\r\nbar\r\n".
redis的aof文件和主从复制时主数据库向从数据库发送的内容头使用了统一请求协议。
结果含四个部分1.id 2,命令执行时的unix时间。3、该命令的耗时时间,单位是微妙,4,命令及参数。
MoNITOR 监控redis执行的所有命令,
一、五种基本类型
keys *exists key_name
del key_name
type key_name #用来返回键对应的数据类型
redis所有的redis命令都是原子操作。
1)String类型
一个字符串类型键允许存储的最大容量是512MB。set key_name value; get key; incr key_name;#如果键值不存在,则默认为0,增加后是1.; incrBy key incre_num; DECR key, DECRBY key dec_num;
INCRBYFLOAT key incremnt; APPEND key value#追加值,返回追加后字符串的长度。; STRLEN
MSET key1 val1 key2 val2 ...#同时得到或者设置多个值。
MGET key1 key2
GETBIT key offset ; SETBIT key offset value; 得到位,如果超过总位数,则默认为0.如果设置的超过了总位数,
BITCOUNT key #得到值不是0的二进制位个数
BITCOUNT key start end #统计范围内的二进制位个数
BITOP AND/OR/XOR/NOT destkey key1 key2 ... #对多个字符串键进行位运算。
2)散列类型
其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型。HSET key field value; HGET key field; #可以用来插入和更新操作。
HMSET key field value [field value] ...
HMGET key field [field ...]
HGETALL key
HEXISTS key field #判断一个字段是否存在。
HSETNX key field value #如果字段已经存在,HSETNX命令将不执行任何操作。
HINCRBY key field increment #使字段增加指定的整数。如不存在,则自动建立并设置为0.
HDEL key field [field ...] #删除一个或多个字段,返回删除的字段个数。
HKEYS map_key #只获取字段名字
HVALS map_key #只获取字段值
HLEN map_key #获取字段数量
3)列表类型
内部是使用双向链表实现的。LPUSH key value [ value ...] #想列表中增加元素,返回增加元素后列表的长度。
RPUSH key value [value ...]
LPOP key
RPOP key
LLEN
LRANGE key start stop #获得列表中的某一个片段。返回值区间[start,stop],负数表示从右数第几个元素。start>stop,return null;
#stop大于实际的索引范围,则会返回到列表最右边的元素。
LREM key count value #删除前count个value值。cout==0, 删除所有,count>0从左删,else从右删。
LINDEX key index; LSET key index value #返回或设置指定索引的元素值。
LTRIM key start end #删除指定索引范围外的所有元素。
LINSERT key before|after pivot value #首先找到值为pivot的元素,然后在其前或后插入value
RPOPLPUSH source destination #先从source列表类型键的邮编弹出一个元素,然后放入destion的左边。
4)集合类型
SADD key member [member ... ] #返回实际加入的数量。SREM key memeber [mem1...]
SMEMBERS key #返回集合中的所有元素。
SISMEMEBE key memeber
SDIFF key [ key ..] #集合的差集、交集、并集。
SINTER key [key ..]
SUNION key [key ..]
SCARD key #获取集合中元素个数。
SDIFFSTORE destination key [key ...] #diff并转储
SINTERSTORE | SUNIONSTORE
SRANDMEMBER key [count] #随机会的count个值。count>0不重复, count《0,可能重复。
SPOP #随机弹出一个元素。
5)有序集合
使用散列表和跳跃表实现的;分数相同则按照字典顺序排列。ZADD key score memeber [score member ... ] #有则替换,无则增加。+inf -inf表示无穷大
ZSCORE key member
ZRANGE key start stop [WITHSCORES] 返回索引【start,stop】间的元素。后边的参数表示同时返回分数
ZREVRANGE key start stop [WITHSCORES]
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count], #可以加上(min表示不希望加上端点值。
ZINCRBY key increment member
ZCARD key #获得集合中元素的数量
ZCOUNT key min max #min和max范围内的元素个数
ZREM key member [member ...] #删除多个元素。
ZREMRANGEBYRANK key start stop #删除指定排名范围内的所有元素。
ZREMRANGEBYSCORE key min max #删除指定分数范围内的元素。
ZRANK key member #获得排名
ZINRWEARORE destination numkeys key[ key ...] [WEIGHTS wieght[weight ...]] [ AGGREGATE SUM|MIN|MAX] #AGGREGATE后边的参数指明结果集中的分数计算方式,WIGHTS表示各个集合的权重。
二、redis其他命令
1.MULTI #Redis中的事务,不提供回滚功能
命令列表。。EXEC #返回值是所有这些命令的返回值组成的列表。
#语法错误,不会执行
#运行时错误,仍然挥之难过。
2.WATCH命令
监控一个或多个键,一旦其中一个键被修改,之后的事务就不会执行。监控一直持续到EXEC命令。UNWATCH #取消监控
3.EXPIRE命令,设置一个键的生存时间,单位是秒。
eg, SET session:29e3d uid1112EXPIRE session:29e3d 600 #10分钟后过期,返回值表示是否设置成功。
TTL key #查看某个键还有多久,返回-1表示永久存在
更精确的设置生存时间可以使用命令 PEXPIRE key millseconds。对应PTTL key
由于生存时间儿删除的键不会影响watch命令的执行。
EXPIREAT key UNIX_time #生存的截止时间。
4.将redis用作缓存使用
修改配置文件的maxmemory参数,限制Redis最大可用内存大小;当超过这个限制后,会依据maxmemeory-policy参数指定的策略来删除不需要的键。策略有:volatile-lru :LRU算法,(只针对有生存时间的)
allkeys-lru :lRU for all
volatile-random|allkeys-random :随机删除一个键
volatile-ttl:生存时间最近的一个键 noeviction:不删除值返回错误。
5.SORT命令
可以对列表、集合、有续集和进行排序。SORT key [ALPHA] [DESC] #不加alpha参数的话,redis会把所有的元素转换成double来比较,
SORT key BY field #eg. SORT sortbylist BY itemscore:* desc #sortbylist是一个列表
SORT的时间复杂度是O(n+mlogm),(n是要排序的列表中元素个数,m表示要返回的元素个数。
GET参数:
SORT tag:ruby:posts BY post:*->time DESC GET post:*->title STORE destinataion #GET #会返回元素本身的值。,STORE会把结果放入目的键中。
6.BRPOP | BLPOP
和RPOP的区别是,BRPOP会在没有元素的情况下阻塞。BRPOP key1 key2 key3 timeout #阻塞时间,0表示不限制时间。如果多个键的列表中都有元素,则有限返回第一个列表。
#可以借助这个功能实现优先级队列。
7. PUBLISH SUBSCIRBE
PUBLISH CHANNEL message #向某个topic|channel中发送消息。返回值表示订阅者数量。SUBSCRIBE CHANNEL [CHANNEL] #只能收到后续发布的消息,之前的就收不到了。
PSUBSCRIBE 命令可以指定订阅的规则。
REDIS的备份功能。
1.备份
SAVE/BGSAVE` #执行快照功能,前者是主进程发起的,后者是fork的子进程发起的。写时复制策略,所以fork函数发生的一刻父子进程共享同一内存数据。1)fork一个子进程。2)父进程继续执行客户端发过来的命令,而子进程开始键内存中的数据写入硬盘中的临时文件。3)子进程写入所有的数据后会用该临时文件替换掉旧的RDB文件,一次快照完成。
AOF持久化方式(append only file方式) #开启aof方式后,每执行一条会更改redis中数据的命令,redis就会将该命令写入硬盘中的aof文件。
每当达到一定条件时,redis就会自动重写aof文件。冗余的命令会被删除,重写的过程只和内存中的数据有关,和之前的aof文件无关。
(命令是先放入磁盘缓存的,一定时间后同步到硬盘上) 同步时机的选择:
appendfsync always|everysec|no #分别表示每次执行都要执行同步,每秒进行一次同步,不主动进行同步而是有操作系统没30s执行一次同步。
2.复制
同步后的数据库分为两类,一类是主数据库,另一类是从数据库。主数据库进行读写操作,发生写操作时,自动将数据同步给从数据库。而从数据库是只读的,并接受主数据库同步来的数据。一个主数据库有多个从数据库,而一个从数据库只能有一个主。
只需要在启动服务器的过程中加上参数 --slaveof ip_of_master master_port
当一个从数据库启动后,会向煮熟库发送sync命令。煮熟库接收到sync命令后开始保存快照,并将保存期接收到的命令缓存起来。快照完成后,会将快照文件和所有缓存的命令发送给从数据库。从数据库接受到这些文件
后,载入快照并执行缓存命令。不支持断电续传。
3.redis安全
默认可以接受任何地址发送来的请求。可以通过修改bind参数,只允许某个地址连接redis。requirepass password #设置一个密码。
通过auth password来进行认证。
4.命名命令。
rename-command COMMAND xxxxx5.redis的通信协议
a.简单协议错误回复以-开头,并在后边跟上错误消息,最后以\r\n结尾。
状态回复以+开头,并在后边跟上状态消息,最后以\r\n结尾。
整数回复以:开头,并在后面跟上数字,最后以\r\n结尾。
字符串回复以$开头,并在后面跟上字符串的长度,最后以\r\n结尾。然后是字符串的内容和\r\n了。
多行字符串回复以*开头,并在后面跟上字符串回复的组数,最后以\r\n结尾。然后是字符串回复的具体内容了。
b.统一请求协议
命令格式和多行字符串回复的格式很类似。
如:set Foo bar 的同意请求写法是“*3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n$\r\nbar\r\n".
redis的aof文件和主从复制时主数据库向从数据库发送的内容头使用了统一请求协议。
6.redis实用工具
SLOWLOG GET #获得当前的耗时命令日志。当一条命令的执行时间超过限制后,会把该命令的执行时间放入耗时日志中一共查看。可以通过配置slowlog-log-slower-than参数设置这个阈值。结果含四个部分1.id 2,命令执行时的unix时间。3、该命令的耗时时间,单位是微妙,4,命令及参数。
MoNITOR 监控redis执行的所有命令,