首页 > 代码库 > 重温redis命令

重温redis命令

 

redis是已知的性能最快的key-value 数据库。

1.key相关命令

exites 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的开销

例如:

技术分享

 

重温redis命令