在安装redis目录下,执行./bin/redis-server redis-conf来启动redis的服务,执行./bin/redis-cli来启动redis客户端,在客户端操作命令。
一、String数据类型
1、String是redis数据库中最基本的数据类型,可以接受图片、json格式数据,redis中的字符串的value最多可以容纳512m
2、基本命令
append key value :append追加命令,如果key存在,则追加到已存在的value值;如果key不存在,则创建一对新的key/value,并返回value值的长度。
exists key :判断是否存在key,存在返回1,不存在返回0
get key :通过get命令获取key对应的value值,存在则返回value值;不存在则返回nil
set key value :通过set命令为key设置value值,存在key则覆盖value值。如果value值有带空格的字符串,必须加上双引号或者单引号,否则报错。
strlen key :通过strlen命令获取key对应的value值的长度;如果不存在key,则返回0
incr key :给key对应的value值递增1,并返回递增后的值。如果key不存在,则递增后默认初始值是1;如果key对应的value值不是整数,则会报错
decr key :给key对应的value值递减1,并返回递减后的值。如果key不存在,则递减后默认初始值是-1;如果key对应的value值不是整数,则报错。
incrby key 3:给key对应的value值自增指定的值,并返回递增后的值。如果key不存在,则默认初始值是0;如果key对应的value值不是整数,则报错。
decrby key 3:给key对应的value值自减指定的值,并返回递减后的值。如果key不存在,则默认初始值是0;如果key对应的value值不是整数,则会报错
getset key 2:通过getset获取key对应的value值,并给value设置新的值,返回的是设置前获取的值。
setex key 10 value:给value值设置存活时间10秒,ttl key可以查看存活时间(秒级别)的变化值,0表示过期,-1表示永远不过期,过期返回nil
del key :删除key键,存在返回1;不存在返回0
setrange key n value:通过setrange给key对应的value值从n位置开始替代给定的值,如果长度超过原来的长度,在末尾补充0
getrange key n m :通过getrang获取key对应的value值,从n位置开始到m位置,n>=0,如果key不存在,则返回空字符串
setbit key n 1 :通过setbit设置key对应的value值从0开始到n位置,并返回原有值0
getbit key n :通过getbit获取指定的n位置的key对应的value值
mset key1 value1 key2 value2:通过mset命令设置两个键值对,可以设置多个键值对
msetnx key3 value3 key4 value4:通过msetnx设置不存在的键值对,并返回1
mget key1 key2 :通过mget批量获取多个键对应的value值,如果不存在键则返回nil
二、list数据类型
1、在redis中,list类型是按照插入顺序排序的字符串链表,和普通的数据链表一样,可以在头部(left)和尾部(right)插入新的元素。如果key不存在,在redis中可以新建新的链表;如果链表中所有的元素被删除了,那么该键也会从redis数据库中删除。
redis中包含最多的元素数量是4294967295。
2、基本命令
lpush key v1 v2 v3 :如果key不存在,则创建与key关联的list列表,并把参数中给定的值从左到右加入list列表中
lrang key n m :通过lrang获取key中从n位置开始到m的值,n可以从0开始。当n=0时,表示从第一个元素开始,m=-1时表示最后一个元素。如果空则返回empty
lpushx key value :通过lpushx命令给key设置,如果key不存在,则返回0
lpushx key e :通过lpushx命令获取key对应中的value的链表中的数量,当key不存在时返回0
lrange key 0 0 :获取key对应的头部元素
lpop key :取出key对应的头部元素
lrem key n a :通过lrem命令从key对应的链表中删除n个a值(从头部left到尾部right),并返回删除的数量;如果不存在key,则返回0
lindex key n :通过lindex命令获取key对应链表中的第n索引的值(从0开始),如果n超出索引,则返回nil
lset key n value :通过lset命令设置key对应中的链表集合,把集合中n位置索引的元素替换为给定的value值。如果n值超过元素个数则报错
ltrim key n m :通过ltrim命令保留索引值从n到m 的元素,第n个元素和第m个元素都被保留
linsert key before value newValue :在value值前插入新的newValue元素,如果原元素不存在,则返回-1报错;key不存在,则返回0
linsert key after value newValue :在value值后插入新的newValue元素,如果原元素不存在,则返回-1报错;key不存在,则返回0
rpush key v1 v2 v3 :通过rpush命令为key插入给定的参数元素,顺序从左到右
rpushx key value :通过rpush命令为key在链表尾部插入新的元素,如果key不存在,则返回0
rpoplpush key1 key2 :通过rpoplpush命令把key1尾部的元素弹出,然后插入到key1的头部(原子性的完成这两部操作)
注意: Redis链表经常会被用于消息队列的服务,以完成多程序之间的消息交换。假设一个应用程序正在执行LPUSH操作向链表中添加新的元素,我们通常将这样的程序称之为"生产者(Producer)",而另外一个应用程序正在执行RPOP操作从链表中取出元素,我们称这样的程序为"消费者(Consumer)"。如果此时,消费者程序在取出消息元素后
立刻崩溃,由于该消息已经被取出且没有被正常处理,那么我们就可以认为该消息已经丢失,由此可能会导致业务数据丢失,或业务状态的不一致等现象的发生。然而通过使用RPOPLPUSH命令,消费者程序在从主消息队列中取出消息之后再将其插入到备份队列中,直到消费者程序完成正常的处理逻辑后再将该消息
从备份队列中删除。同时我们还可以提供一个守护进程,当发现备份队列中的消息过期时,可以重新将其再放回到主消息队列中,以便其它的消费者程序继续处理。
三、hashset数据类型
1、在redis中,hashset数据类型可以看成是String key和String value的map容器,所以该数据类型适合存储键值对的信息。每个hash可以存储4294967295个键值对。
2、基本命令
hset hash feild value :通过hset命令给键值为hash设置字段为feild,值为value
hget hash feild :通过hget命令获取键值为hash,字段为feild的值。如果feild不存在,则返回nil
hset hash feild1 value1 :通过hset命令给与hash关联的键值,设置新的字段feild1,其值是value1
hlen hash :获取hash键的字段数量
hexists hash feild :判断hash键中是否存在字段名为feild的字段,存在则返回1 ;不存在则返回0
hdel hash feild :删除hash键中字段名为feild的字段,存在则返回1 ;不存在则返回0
hsetnx hash feild1 value1 :通过hsetnx命令给hash键新增feild1字段,其值为value1,并返回1;如果feild1字段存在,则返回0
hincrby hash feild value :通过hincrby命令给hash键,字段名为feild的值自增value,value必须是整数,可以是负数
hmset hash feild1 value1 feild2 value2 :通过hmset命令给hash键设置多个键值对
hmget hash feild1 feild2 :通过hmset命令获取多个字段名的值
hgetall hash :通过hgetall命令获取hash键的所有字段和其值
hkeys hash :通过hkeys命令获取hash键中所以字段名
hvals hash :通过hvals命令获取hash键中所以字段的值
四、set数据类型
1、在redis中,set数据类型和list一样都是没有排序的数据集合,在数值上可以对其进行新增、删除以及判断是否存在指定的元素。set中最多可以有4294967295个元素。
需要注意的是,set要在指定的时间内完成操作。set和list不同的是,set不允许存在重复的元素,而且在操作集合计算,如unions、intersections和differences,都是
在服务端操作,大大提高效率,减少网络传输和IO开销。
2、基本命令
sadd s1 v1 v2 v3 :通过sadd命令给s1集合设置多个元素,并返回插入的个数。如果存在,则不插入
sismember s1 value :通过sismember命令判断在s1集合中是否存在给定的value元素,并返回1;如果不存在则返回0
smembers s1 :通过smembers命令获取s1集合中所有的元素
scard s1 :通过scard命令获取s1集合中元素的个数
del s1 :通过del命令删除s1集合
srandmember s1 :通过srandmember命令获取s1集合中任意一个元素
spop s1 :通过spop命令弹出s1集合中尾部的最后一个元素,事实上弹出的元素不一定是最后一个插入的元素或最后成员
srem s1 v1 v2 :通过srem命令删除s1集合中给定的元素,并返回可以移除的个数
smove s1 s2 value :通过smove命令把s1集合中的value元素移到s2集合中,并返回1 。如果不存在,则返回0
sdiff s1 s2 s3 :s1集合和s2进行差异比较,比较结果后和s3集合进行比较
sdiffstore diffkey s1 s2 s3 :把s1、s2、s3三个集合中差异比较后的结果保存到diffkey集合中,返回元素个数
sinter s1 s2 s3 :通过sinter命令获取s1、s2、s3三个集合中的交集,返回交集中的元素
sinterstore sinkey s1 s2 s3 :通过sinterstore命令获取s1、s2、s3集合中的交集元素,并保存到sinkey集合中,返回的是集合元素个数
sunion s1 s2 s3 :通过sunion命令获取s1、s2、s3集合中并集,返回所有的元素
sunionstore unionkey s1 s2 s3 :通过sunionstore命令获取s1、s2、s3集合中的并集,并保存到unionkey集合中,返回并集集合中元素个数
运用范围:
1). 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
2). 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个
Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。
五、sortedset数据类型
1、sortedset类型和set类型一样,都是字符串集合,都不允许在一个集合中出现重复的元素。他们的区别是,在sortedset集合中有一个与之关联的分数(score)。在redis中sortedset集合正是利用这个分数(score)
进行排序的,尽管sortedset集合中的元素是唯一的,但是分数(score)可以重复。在sortedset集合中对其删除、新增等操作也是挺快的。sortedset集合中的元素是有序的,即便是这样对元素成员访问效率也是挺快的。
2、基本命令
zadd set 1 value1 2 value2 :通过zadd命令添加set集合,分数为1、2,元素分别为value1、value2,返回添加元素个数
zrang set 0 -1 withscores :0代表第一个元素,-1代表最后一个元素,通过zrang命令获取set集合中的分数和元素,当没有加上withscores时,只返回元素
zrank set value :通过zrank命令获取value元素在sorted-set集合中的索引位置,0代表起始索引位置。当元素不存在时,返回nil
zcard set :通过zcard命令获取sorted-set集合中的元素的数量。如果集合不存在,返回0
zcount set 1 2 :通过zcount命令获取与sorted-set关联分数在1 到2之间的元素数量(包括1和2的元素)。如果不存在给定的分数区间内,返回的是0
zrem set v1 v2 :通过zrem命令删除sorted-set集合中的给定的v1、v1元素,返回的是被删除的元素数量。
del set :删除sorted-set集合
zscore set value :通过zscore命令获取sorted-set集合中给定value元素的分数,返回值是字符串形式。如果元素不存在,则返回nil
zincrby set 2 value :将指定的value元素的分数增加2(可以是负数),并返回增加后的分数。如果元素不存在,则会默认自动加上,并且分数从0开始
zrangebyscore set 1 2:通过zrangebyscore命令获取集合中分数从1到2之间的元素。如果分数不存在,则返回empty
zrangebyscore set (1 2:通过zrangebyscore命令获取集合中分数从1(不包含1)到2之间的元素。
zremrangebyrank set 1 3:通过zremrangebyrank命令删除sorted-set集合中的索引位置从1到3的元素,返回的是被删除的元素数量
zremrangbyscore set 1 2:通过zremrangebyscore命令删除分数在1到2之间的元素,返回的是被删除的元素数量
zrangbyscore set -inf +inf limit 2 2:-inf代表sorted-set集合中第一个元素,-inf代表集合中最后一个元素,limit是限制从索引位置2开始保留2个元素
zrevrang set 0 -1 withscore:通过zrevrang命令获取索引位置从高到低的元素,返回的是分数和元素
zrevrang set 2 4 :通过zrevrang命令获取sorted-set集合中分数2到4之间的元素,如果不存在,则返回empty
zrevrank set value:通过zrevrank命令获取sorted-set集合中索引位置从高到低给定的元素的索引位置
zrevrangebyscore set 3 0:通过zrevrangebyscore命令获取分数在0到3之间的元素,并以相反的顺序输出,即从高到低
六、key数据类型
1、基本命令
keys m* :通过keys获取与给定的模型匹配的所有键
del k1 k2:删除指定的键,并返回被删除的数量
exists k1 k2 :判断是否存在指定的键,并返回存在的键的数量
move key 1 :把当前数据库中的key键移除到id为1的数据库中,并返回数量,可以通过select 1 进入数据库中查看是否存在
rename oldkey newkey :把oldkey键名称改为newkey,当原来的键不存在时,返回Nil
renamenx oldkey newkey:把oldkey键名称改为newkey,当原来的键不存在时,返回0
expire key 10 :给键设置超时时间(秒)
ttl key :查看指定的键还剩下多少存活时间
type key :查看指定键对应的值的数据类型,如果键不存在,则返回none
randomkey :返回数据库中任意键,如果不存在任意键,则返回nil
flushda:清空当前数据库中的数据
七、redis数据库应用场景
1.取最新N个数据的操作
比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的5000条评论的ID放在Redis的List集合中,并将超出集合部分从数据库获取
(1)使用LPUSH latest.comments <ID>命令,向list集合中插入数据
(2)插入完成后再用LTRIM latest.comments 0 5000命令使其永远只保存最近5000个ID
(3)然后我们在客户端获取某一页评论时可以用下面的逻辑(伪代码)
2.排行榜应用,取TOP N操作
这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。
3.需要精准设定过期时间的应用
比如你可以把上面说到的sorted set的score值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除Redis中的过期数据,你完全可以把 Redis里这个过期时间当成是对数据库中数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。
4.计数器应用
Redis的命令都是原子性的,你可以轻松地利用INCR,DECR命令来构建计数器系统。
5.Uniq操作,获取某段时间所有数据排重值
这个使用Redis的set数据结构最合适了,只需要不断地将数据往set中扔就行了,set意为集合,所以会自动排重。
6.实时系统,反垃圾系统
通过上面说到的set功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等。没有做不到,只有想不到。
7.Pub/Sub构建实时消息系统
Redis的Pub/Sub系统可以构建实时的消息系统,比如很多用Pub/Sub构建的实时聊天系统的例子。
8.构建队列系统
使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。
9.缓存系统
一、String数据类型
1、String是redis数据库中最基本的数据类型,可以接受图片、json格式数据,redis中的字符串的value最多可以容纳512m
2、基本命令
append key value :append追加命令,如果key存在,则追加到已存在的value值;如果key不存在,则创建一对新的key/value,并返回value值的长度。
exists key :判断是否存在key,存在返回1,不存在返回0
get key :通过get命令获取key对应的value值,存在则返回value值;不存在则返回nil
set key value :通过set命令为key设置value值,存在key则覆盖value值。如果value值有带空格的字符串,必须加上双引号或者单引号,否则报错。
strlen key :通过strlen命令获取key对应的value值的长度;如果不存在key,则返回0
incr key :给key对应的value值递增1,并返回递增后的值。如果key不存在,则递增后默认初始值是1;如果key对应的value值不是整数,则会报错
decr key :给key对应的value值递减1,并返回递减后的值。如果key不存在,则递减后默认初始值是-1;如果key对应的value值不是整数,则报错。
incrby key 3:给key对应的value值自增指定的值,并返回递增后的值。如果key不存在,则默认初始值是0;如果key对应的value值不是整数,则报错。
decrby key 3:给key对应的value值自减指定的值,并返回递减后的值。如果key不存在,则默认初始值是0;如果key对应的value值不是整数,则会报错
getset key 2:通过getset获取key对应的value值,并给value设置新的值,返回的是设置前获取的值。
setex key 10 value:给value值设置存活时间10秒,ttl key可以查看存活时间(秒级别)的变化值,0表示过期,-1表示永远不过期,过期返回nil
del key :删除key键,存在返回1;不存在返回0
setrange key n value:通过setrange给key对应的value值从n位置开始替代给定的值,如果长度超过原来的长度,在末尾补充0
getrange key n m :通过getrang获取key对应的value值,从n位置开始到m位置,n>=0,如果key不存在,则返回空字符串
setbit key n 1 :通过setbit设置key对应的value值从0开始到n位置,并返回原有值0
getbit key n :通过getbit获取指定的n位置的key对应的value值
mset key1 value1 key2 value2:通过mset命令设置两个键值对,可以设置多个键值对
msetnx key3 value3 key4 value4:通过msetnx设置不存在的键值对,并返回1
mget key1 key2 :通过mget批量获取多个键对应的value值,如果不存在键则返回nil
二、list数据类型
1、在redis中,list类型是按照插入顺序排序的字符串链表,和普通的数据链表一样,可以在头部(left)和尾部(right)插入新的元素。如果key不存在,在redis中可以新建新的链表;如果链表中所有的元素被删除了,那么该键也会从redis数据库中删除。
redis中包含最多的元素数量是4294967295。
2、基本命令
lpush key v1 v2 v3 :如果key不存在,则创建与key关联的list列表,并把参数中给定的值从左到右加入list列表中
lrang key n m :通过lrang获取key中从n位置开始到m的值,n可以从0开始。当n=0时,表示从第一个元素开始,m=-1时表示最后一个元素。如果空则返回empty
lpushx key value :通过lpushx命令给key设置,如果key不存在,则返回0
lpushx key e :通过lpushx命令获取key对应中的value的链表中的数量,当key不存在时返回0
lrange key 0 0 :获取key对应的头部元素
lpop key :取出key对应的头部元素
lrem key n a :通过lrem命令从key对应的链表中删除n个a值(从头部left到尾部right),并返回删除的数量;如果不存在key,则返回0
lindex key n :通过lindex命令获取key对应链表中的第n索引的值(从0开始),如果n超出索引,则返回nil
lset key n value :通过lset命令设置key对应中的链表集合,把集合中n位置索引的元素替换为给定的value值。如果n值超过元素个数则报错
ltrim key n m :通过ltrim命令保留索引值从n到m 的元素,第n个元素和第m个元素都被保留
linsert key before value newValue :在value值前插入新的newValue元素,如果原元素不存在,则返回-1报错;key不存在,则返回0
linsert key after value newValue :在value值后插入新的newValue元素,如果原元素不存在,则返回-1报错;key不存在,则返回0
rpush key v1 v2 v3 :通过rpush命令为key插入给定的参数元素,顺序从左到右
rpushx key value :通过rpush命令为key在链表尾部插入新的元素,如果key不存在,则返回0
rpoplpush key1 key2 :通过rpoplpush命令把key1尾部的元素弹出,然后插入到key1的头部(原子性的完成这两部操作)
注意: Redis链表经常会被用于消息队列的服务,以完成多程序之间的消息交换。假设一个应用程序正在执行LPUSH操作向链表中添加新的元素,我们通常将这样的程序称之为"生产者(Producer)",而另外一个应用程序正在执行RPOP操作从链表中取出元素,我们称这样的程序为"消费者(Consumer)"。如果此时,消费者程序在取出消息元素后
立刻崩溃,由于该消息已经被取出且没有被正常处理,那么我们就可以认为该消息已经丢失,由此可能会导致业务数据丢失,或业务状态的不一致等现象的发生。然而通过使用RPOPLPUSH命令,消费者程序在从主消息队列中取出消息之后再将其插入到备份队列中,直到消费者程序完成正常的处理逻辑后再将该消息
从备份队列中删除。同时我们还可以提供一个守护进程,当发现备份队列中的消息过期时,可以重新将其再放回到主消息队列中,以便其它的消费者程序继续处理。
三、hashset数据类型
1、在redis中,hashset数据类型可以看成是String key和String value的map容器,所以该数据类型适合存储键值对的信息。每个hash可以存储4294967295个键值对。
2、基本命令
hset hash feild value :通过hset命令给键值为hash设置字段为feild,值为value
hget hash feild :通过hget命令获取键值为hash,字段为feild的值。如果feild不存在,则返回nil
hset hash feild1 value1 :通过hset命令给与hash关联的键值,设置新的字段feild1,其值是value1
hlen hash :获取hash键的字段数量
hexists hash feild :判断hash键中是否存在字段名为feild的字段,存在则返回1 ;不存在则返回0
hdel hash feild :删除hash键中字段名为feild的字段,存在则返回1 ;不存在则返回0
hsetnx hash feild1 value1 :通过hsetnx命令给hash键新增feild1字段,其值为value1,并返回1;如果feild1字段存在,则返回0
hincrby hash feild value :通过hincrby命令给hash键,字段名为feild的值自增value,value必须是整数,可以是负数
hmset hash feild1 value1 feild2 value2 :通过hmset命令给hash键设置多个键值对
hmget hash feild1 feild2 :通过hmset命令获取多个字段名的值
hgetall hash :通过hgetall命令获取hash键的所有字段和其值
hkeys hash :通过hkeys命令获取hash键中所以字段名
hvals hash :通过hvals命令获取hash键中所以字段的值
四、set数据类型
1、在redis中,set数据类型和list一样都是没有排序的数据集合,在数值上可以对其进行新增、删除以及判断是否存在指定的元素。set中最多可以有4294967295个元素。
需要注意的是,set要在指定的时间内完成操作。set和list不同的是,set不允许存在重复的元素,而且在操作集合计算,如unions、intersections和differences,都是
在服务端操作,大大提高效率,减少网络传输和IO开销。
2、基本命令
sadd s1 v1 v2 v3 :通过sadd命令给s1集合设置多个元素,并返回插入的个数。如果存在,则不插入
sismember s1 value :通过sismember命令判断在s1集合中是否存在给定的value元素,并返回1;如果不存在则返回0
smembers s1 :通过smembers命令获取s1集合中所有的元素
scard s1 :通过scard命令获取s1集合中元素的个数
del s1 :通过del命令删除s1集合
srandmember s1 :通过srandmember命令获取s1集合中任意一个元素
spop s1 :通过spop命令弹出s1集合中尾部的最后一个元素,事实上弹出的元素不一定是最后一个插入的元素或最后成员
srem s1 v1 v2 :通过srem命令删除s1集合中给定的元素,并返回可以移除的个数
smove s1 s2 value :通过smove命令把s1集合中的value元素移到s2集合中,并返回1 。如果不存在,则返回0
sdiff s1 s2 s3 :s1集合和s2进行差异比较,比较结果后和s3集合进行比较
sdiffstore diffkey s1 s2 s3 :把s1、s2、s3三个集合中差异比较后的结果保存到diffkey集合中,返回元素个数
sinter s1 s2 s3 :通过sinter命令获取s1、s2、s3三个集合中的交集,返回交集中的元素
sinterstore sinkey s1 s2 s3 :通过sinterstore命令获取s1、s2、s3集合中的交集元素,并保存到sinkey集合中,返回的是集合元素个数
sunion s1 s2 s3 :通过sunion命令获取s1、s2、s3集合中并集,返回所有的元素
sunionstore unionkey s1 s2 s3 :通过sunionstore命令获取s1、s2、s3集合中的并集,并保存到unionkey集合中,返回并集集合中元素个数
运用范围:
1). 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
2). 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个
Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。
五、sortedset数据类型
1、sortedset类型和set类型一样,都是字符串集合,都不允许在一个集合中出现重复的元素。他们的区别是,在sortedset集合中有一个与之关联的分数(score)。在redis中sortedset集合正是利用这个分数(score)
进行排序的,尽管sortedset集合中的元素是唯一的,但是分数(score)可以重复。在sortedset集合中对其删除、新增等操作也是挺快的。sortedset集合中的元素是有序的,即便是这样对元素成员访问效率也是挺快的。
2、基本命令
zadd set 1 value1 2 value2 :通过zadd命令添加set集合,分数为1、2,元素分别为value1、value2,返回添加元素个数
zrang set 0 -1 withscores :0代表第一个元素,-1代表最后一个元素,通过zrang命令获取set集合中的分数和元素,当没有加上withscores时,只返回元素
zrank set value :通过zrank命令获取value元素在sorted-set集合中的索引位置,0代表起始索引位置。当元素不存在时,返回nil
zcard set :通过zcard命令获取sorted-set集合中的元素的数量。如果集合不存在,返回0
zcount set 1 2 :通过zcount命令获取与sorted-set关联分数在1 到2之间的元素数量(包括1和2的元素)。如果不存在给定的分数区间内,返回的是0
zrem set v1 v2 :通过zrem命令删除sorted-set集合中的给定的v1、v1元素,返回的是被删除的元素数量。
del set :删除sorted-set集合
zscore set value :通过zscore命令获取sorted-set集合中给定value元素的分数,返回值是字符串形式。如果元素不存在,则返回nil
zincrby set 2 value :将指定的value元素的分数增加2(可以是负数),并返回增加后的分数。如果元素不存在,则会默认自动加上,并且分数从0开始
zrangebyscore set 1 2:通过zrangebyscore命令获取集合中分数从1到2之间的元素。如果分数不存在,则返回empty
zrangebyscore set (1 2:通过zrangebyscore命令获取集合中分数从1(不包含1)到2之间的元素。
zremrangebyrank set 1 3:通过zremrangebyrank命令删除sorted-set集合中的索引位置从1到3的元素,返回的是被删除的元素数量
zremrangbyscore set 1 2:通过zremrangebyscore命令删除分数在1到2之间的元素,返回的是被删除的元素数量
zrangbyscore set -inf +inf limit 2 2:-inf代表sorted-set集合中第一个元素,-inf代表集合中最后一个元素,limit是限制从索引位置2开始保留2个元素
zrevrang set 0 -1 withscore:通过zrevrang命令获取索引位置从高到低的元素,返回的是分数和元素
zrevrang set 2 4 :通过zrevrang命令获取sorted-set集合中分数2到4之间的元素,如果不存在,则返回empty
zrevrank set value:通过zrevrank命令获取sorted-set集合中索引位置从高到低给定的元素的索引位置
zrevrangebyscore set 3 0:通过zrevrangebyscore命令获取分数在0到3之间的元素,并以相反的顺序输出,即从高到低
六、key数据类型
1、基本命令
keys m* :通过keys获取与给定的模型匹配的所有键
del k1 k2:删除指定的键,并返回被删除的数量
exists k1 k2 :判断是否存在指定的键,并返回存在的键的数量
move key 1 :把当前数据库中的key键移除到id为1的数据库中,并返回数量,可以通过select 1 进入数据库中查看是否存在
rename oldkey newkey :把oldkey键名称改为newkey,当原来的键不存在时,返回Nil
renamenx oldkey newkey:把oldkey键名称改为newkey,当原来的键不存在时,返回0
expire key 10 :给键设置超时时间(秒)
ttl key :查看指定的键还剩下多少存活时间
type key :查看指定键对应的值的数据类型,如果键不存在,则返回none
randomkey :返回数据库中任意键,如果不存在任意键,则返回nil
flushda:清空当前数据库中的数据
七、redis数据库应用场景
1.取最新N个数据的操作
比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的5000条评论的ID放在Redis的List集合中,并将超出集合部分从数据库获取
(1)使用LPUSH latest.comments <ID>命令,向list集合中插入数据
(2)插入完成后再用LTRIM latest.comments 0 5000命令使其永远只保存最近5000个ID
(3)然后我们在客户端获取某一页评论时可以用下面的逻辑(伪代码)
2.排行榜应用,取TOP N操作
这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。
3.需要精准设定过期时间的应用
比如你可以把上面说到的sorted set的score值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除Redis中的过期数据,你完全可以把 Redis里这个过期时间当成是对数据库中数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。
4.计数器应用
Redis的命令都是原子性的,你可以轻松地利用INCR,DECR命令来构建计数器系统。
5.Uniq操作,获取某段时间所有数据排重值
这个使用Redis的set数据结构最合适了,只需要不断地将数据往set中扔就行了,set意为集合,所以会自动排重。
6.实时系统,反垃圾系统
通过上面说到的set功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等。没有做不到,只有想不到。
7.Pub/Sub构建实时消息系统
Redis的Pub/Sub系统可以构建实时的消息系统,比如很多用Pub/Sub构建的实时聊天系统的例子。
8.构建队列系统
使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。
9.缓存系统