重温redis命令
redis是已知的性能最快的key-value 数据库。
1.key相关命令
exists key :检查指定的key是否存在 1表示存在 0表示不存在
del key1,key2,key3....:删除指定的key,返回删除key的个数,如果key都不存在返回0
type key :返回给的key的value的类型。返回none表示key不存在,string表示字符串,list表示链表,set表示无序集合...
keys pattern :返回匹配指定模式的所有key
expire key seconds:设置给定key的过期时间
randomkey:返回从当前数据库中随机选择的一个key,如果当前数据库是空的返回空串
rename oldkey newkey :重命名key,如果newkey存在则覆盖,返回1表示成功,0失败。若失败则可能oldkey不存在或者和newkey相同
renamenx oldkey newkey :同上如果newkey存在返回失败
ttl key :返回设置的过期时间key的剩余的秒数,-1表示key不存在或者没有设置过期时间
move key db-index: 将key从当前数据库移动到指定数据库。返回1成功,0表示key不存在或已经在指定的数据库中
案例:
2.数据类型
redis支持多种数据类型,例如:string,list,set,sorted set,hash等。每种数据类型都有其各自的特点。
1.string类型
string类型是二进制安全的,可以把图片和视频文件保存到string中,定义如下
struct sdshdr{ long len; long free; char buf[]; }
buf数组:字符串的实体,保存字符串的内容
len字段:记录buf数组大小
free字段;记录buf数组还有多少空间
因为有len和free记录字符串信息,所以不必使用nil字符作为结束,从而实现二进制安全。为了提高网站的运行速度可以使用string类型存储一些静态文件例如图片,css,js等。
string命令:
set key value :设置key对应的string值,返回1成功,0失败
setnx key value :如果key不存在则设置,如果key已存在返回0
get key : 获取key对应的string值 如果key不存在返回nil
getset key value :先获取key的值,再设置key的值,如果key不存在返回nil
mget key1,key2... :一次获取多个key的值,如果对应的key不存在返回nil
mset key1 values1 key2 values2 ... :一次设置多个key成功放回1 ,失败返回0 表示都没有设置
msetnx key1 values1 key2 values2 ...:一次设置多个key,但不会覆盖已存在的
incr key : 向key对应的value加1,并返回新值,注意该key的值必须是int类型 否则返回错误 ,如果key 不存在则设置key 为1
decr key : 向key对应的value做-1,并返回新值,注意该key的值必须是int类型 否则返回错误 ,如果key 不存在则设置key 为-1
incrby key integer : 向key对应的值加上一个指定的整数,key不存在则新建一个,并认为原来的值是0
decrby key interger :向key对应的值减去一个指定的整数,key不存在则新建一个,并认为原来的值是0
案例:
3.list类型
list数据类型指key对应value是一个双向链表结构,所以list类型提供链表支持的所有操作。list类型在互联网引用中非常有用,例如存放微博中‘我关注的列表’,或者论坛中所有回帖ID。
list命令:
lpush key string :向key对应的list头部添加一个字符串元素,成功返回1,失败返回0
rpush key string :向key对应的list尾部添加一个字符串元素,成功返回1,失败返回0
llen key :返回key对应list的长度,如果key不存在返回0,如果key对应的类型不是list返回错误。
lrange key start end :返回指定区间内(start~~end)的元素,下表从0开始,负值表示从链表尾部开始计算,-1表示倒数第一个,key不存在返回空列
ltrim key start end :截取list指定区间内(start~~end)元素,成功返回1,key不存在返回错误
lset key index value :设置list中指定下表的元素,成功返回1,key或者下表不存在返回错误。
lrem key count value : 从list 头部(count正数)或尾部(count负数)删除一定数量(count绝对值)的匹配value的元素,返回删除元素的数量,count为0时表示全部删除。
lpop key : 从list头部删除并返回删除的元素。如果key对应的list不存在或者是空返回nil,如果key对应的值不是list返回错误
rpop :从list 尾部删除元素并返回
blpop key1 key2 ... timeout :从左到右扫描key1···key2 ,返回对第一个非空list进行lpop操作并返回。如果所有list都是空或不存在,阻塞timeout秒,timeout为0表示一直阻塞。阻塞时,如果有其他client对key1...key2 中任意一个key进行push炒作,阻塞解除并返回。如果超时发生,则返回nil
brpop key..key2 timeout 功能与plpop类似,不同的是blpop从头删除 而brpop是从尾部删除
案例:
使用list可以实现消息列队功能,减去数据库压力。消息列队类似于实现生活中的排队,每次有消息到达时就把消息放入列队尾部,取出消息时头部取出。要有那个list实现消息列队,先用rpush命令吧消息列队放入尾部,然后使用lpop命令把消息列队从头部取出。
4.set类型
set数据类型是一种无序集合,在redis内部通过hashtable实现,查找和删除元素的时间复杂度为O(1).set数据类型的优点是快速查找元素是否存在,用于记录一些不能重复的数据。例如,在网站注册账号时用户名不能重复,使用set记录注册用户,如果注册的用户已经存在set中,则拒绝注册。
set命令:
sadd key member :添加一个strimg元素到key对应的set集合中,成功返回1,如果元素在集合中返回0 ,key对应的set不存在返回错误
srem key member :从key对应set中移除给定的元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key对应的不是set类型返回错误
spop key :删除并返回key对应set中随机的一个元素,如果set是空或者key对应的set不存在返回nil
srandmember key: 同spop 随机取出一个元素,但不删除该元素
smove srckey dstkey member :从srckey 对应set中移除member并添加到dstkey对用的set中,整个操作是原子的。成功返回1,如果member在srckey中不存在返回0,如果key对应的不是set类型,返回错误
scard key :返回set元素的个数,如果set是空或者key不存在返回0
sismember key member :判断member 是否在set中,存在返回1,不存在或者key对应的set集合不存在返回0
sinter key1,key2,key3... : 返回所有给定的key的交集
sinterstore dstkey key1,key2.... :同sinter,同时将交集存到dstkey对应的set集合中
sunion key1 key2 ... : 返回所有key的并集
sunionstore dstkey key1,key2.... :同sunion ,同时将并集存到dstkey对应的set集合中
sdiff key1 key2 key3 ... :返回给定key的差集
sdiffstore dstkey key1 key2 key3...:同sdiff ,同时将差集存到dstkey对应的set集合中
smembers key 返回key对应set的所有元素,结果是无序的
案例:
set类型通常还可以用来记录做过某些事。例如投票系统,每个用户一天只能投票一次,那么可以使用set记录某个用户的投票情况,只需要一日期作为set的key,则将用户的ID作为member即可。查看某个用户今天是否投过票,只需要以今天的日期作为key查看该用户ID是否存在。
5.sorted set 类型
sorted set类型与set类型相似,都是string类型元素的集合,不同的是sorted set 属于有序集合,而sorted set 通过一个double类型的整数score进行排序。sorted set 通过skiplist(跳跃表)和hashtable组合完成。skiplist负责排序功能,而hashtable负责保存数据。
因为sorted set 是排序的set,所以set能做的事情sorted set 也可以做。而且sorted set 还可以完成一些set不能做的事情,例如,使用sorted set 构建一个具有优先级的列队,这也是list类型不能实现的。sorted set 类型支持的命令如表10-6所示。
sorted set命令:
zadd key score member :添加元素member到集合,元素在集合中存在则跟新对应 score
zrem key member : 删除指定元素,1表示成功,如果元素不存在返回0
zincrby key incr member :增加对应member 的 score值,并重新排序,返回更新后的score值
zrank key member :返回指定元素在集合中的排名(下标),集合中元素按score从小到大排序的
zrevrank key member : 同上,但是集合中元素按score从大到小排序
zrange key start end : 从集合中指定区间的元素,返回结构按score顺序排序
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在给定区间的元素
sorted set 类型在web 应用中非常有用。例如排行榜中按‘顶贴’次数排序,方法是:将排序的值设置成sorted set 的score值,将具体数据设置成相应的value,用户每次按‘顶贴’是,只需执行zadd命令修改score值。
6.hash类型
hash类型是每个key对应一个hashtable,添加删除和修改的时间复杂度都是0(1)。Hash类型适合应用于存储对象,例如用户信息对象。把用户ID作为key,用户信息保存到hash类型中。
新建一个hash类型对象时,为了节省内存,redis使用zipmap存储数据。这个zipmap并不是真正的hashtable,添加,删除和修改操作的时间复杂度都是0(n),但是相比普通hashtable,zipmap节省不是内存。如果field或者value大小超出一定限制,redis在内部自动将zipmap替换为正常的hashtable存储。修改配置文件的hash-max-zipmap-entries和hash-max-zipmap-value选项设置这两个限制。
hash命令:
hset key field value :设置key对应的hash对象中指定域的值。如果key对应的hash对象不存在,将创建此hash对象。如果指定的域已经存在,其值将被重写
hget key field : 返回与field域相关联的值,如果该域不存在或者key对应的hash对象不存在,返回nil
hmget key filed1 。。。filedN :返回存储在key对应的hash对象中各个指定域相关联的值。对于在hash对象不存在的域返回nil
hmset key filed1 value1 filed2 value2 。。。:设置存储在key对应的hash对象中指定域的值。该命令会复写hash中已经存在的域。如果key对应的hash对象不在,将创建此hash对象
hincrby key field interger :将存储在key对应的hash对象中field域相关的值加上interger指定的值。如果key对应的hash不存在,则建立hash对象。如果field域不存在或者不能表示为一个整数,在执行该操作前设置为0
hexists key field :查看指定field域是否存在
hdel key field :删除指定的field域,返回1,。如果指定的域不存在或者key不存在,返回0
hlen key :返回key中filed的数量,如果key 不存在返回0
hkeys key :返回key对应的hahs对象中所有filed名称
hvals key :返回key对应的hash对象中所有的值
hgetall key : 返回key对应的hash对象中所有域和相关联的值。返回值中,每个域名称后面跟着相关联的值。
案例:
7.redis排序
redis支持对list,set,sorted set类型进行排序,sort命令完整格式如下:
sort key [by pattern] [limit strt count] [get pattern] [asc|desc] [alpha] [store dstkey]
1,sort key简单排序
例如:
从案例可以看出 默认排序是 asc就是升序 但是如果是字母按照字母的顺序排序就要加上alpha就可以了
案例:
通过案例可以看出如果不是数字是字母的话不使用alpha就会报错。
[by pattern]
sort 命令可以按照集合元素自身的值排序,还可以按照给定模式(patern)将集合元素内容组合成新的key,并按照新的key对应的内容进行排序,完成后返回排序好的元素集合。
例如:
模式‘name*’ 代表使用key1集合中的填充*,得到3个新的key name1 name2 name3 然后以这3个key的值进行排序,排序的结果就就是,key1集合返回的顺序。
[limit start count]
通过limit可以限定返回结果的数量
例如:
start下标从0开始,上面例子中limit选项的意思是从1开始获取2个
[store dstkey]
使用store可以把排序的结果缓存到指定的key 可以减少cpu的开销
例如: