redis的基本操作
-
TYPE
获得键值的数据类型 TYPE命令用来获得键值的数据类型,返回值可能是string(字符串类型)、hash(散列类 型)、list(列表类型)、set(集合类型)、zset(有序集合类型)
redis的基本数据类型
String(字符串类型)
介绍
字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数 据。你可以用其存储用户的邮箱、JSON化的对象甚至是一张图片。一个字符串类型键允许存 储的数据的最大容量是512MB
字符串类型是其他4种数据类型的基础,其他数据类型和字符串类型的差别从某种角度来 说只是组织字符串的形式不同。
基本操作
-
SET
添加键 -
GET
读取键值(当键不存在时会返回null) -
DEL
删除键(可以删除一个或多个键,返回值是删除的键的个数) -
EXISTS
判断一个键是否存在(如果键存在则返回整数类型1,否则返回0)
递增数字
前面说过字符串类型可以存储任何形式的字符串,当存储的字符串是整数形式时,Redis 提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值.
当要操作的键不存在时会默认键值为0,所以第一次递增后的结果是1。当键值不是整数 时Redis会提示错误。
hash(散列类型)
介绍
个人感觉散列其实就是类似于JAVA中的Map,支持一个key可以存储 键值对
基本操作
-
HSET
添加单个键 -
HGET
读取单个键值(当键不存在时会返回null) -
HGETALL
获取所有键值 -
HDEL
删除一个或多个哈希表字段 -
HEXISTS
查看哈希表 key 中,指定的字段是否存在。(如果键存在则返回整数类型1,否则返回0) -
HLEN
获取哈希表中字段的数量
使用
HSET命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在来决定要执行的是插入操作(update)还是更新操作(insert)。当执行的是插入操作 时(即之前字段不存在)HSET命令会返回1,当执行的是更新操作时(即之前字段已经存 在)HSET命令会返回0。更进一步,当键本身不存在时,HSET命令还会自动建立它。 提示 在Redis中每个键都属于一个明确的数据类型,如通过HSET命令建立的键是散 列类型,通过SET命令建立的键是字符串类型等。使用一种数据类型的命令操作另一种数 据类型的键会提示错误:“ERR Operation against a key holding the wrong kind of value”
list(列表类型)
介绍
list的特性是链表,因此在往list两端进行添加/读取操作的效率是极快的(越靠近两端越快),但获取中间的数据效率很差。与散列类型键最多能容纳的字段数量相同,一个列表类型键最多能容纳232-1个元素。
基本操作
-
LPUSH
用来向列表左边增加元素,返回值表示增加元素后列表的长度。 -
RPUSH
用来向列表右边增加元素,返回值表示增加元素后列表的长度。 -
LPOP
从列表左边 弹出一个元素。 -
RPOP
从列表右边 弹出一个元素。 -
LLEN
获取列表中元素的个数。(当键不存在时LLEN会返回0) -
LRANGE
获取列表片段。(返回索引从satrt到stop之间的所有元素)(LRANGE命令也支持负索引,表示从右边开始计算序数,如"-1"表示最右边第一个元 素,"-2"表示最右边第二个元素,依次类推) -
LREM
(LREM key count value)删除列表中前count个值为value的元素,返回值是实际删除的元素个数。根 据count值的不同,LREM命令的执行方式会略有差异 -
LINDEX
(LINDEX key index value)获得/设置指定索引的元素值 -
LSET
是另一个通过索引操作列表的命令,它会将索引为index的元素赋值为value。 -
LTRIM
(LTRIM key start end )LTRIM命令可以删除指定索引范围之外的所有元素,其指定列表范围的方法和LRANGE 命令相同。 -
LINSERT
(LINSERT key BEFORE|AFTER pivot value)LINSERT命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是 BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
使用
当把列表类型作为队列使用时,RPOPLPUSH命令可以很直观地在多个队列中传递数据。 当source和destination相同时,RPOPLPUSH命令会不断地将队尾的元素移到队首,借助这个特 性我们可以实现一个网站监控系统:使用一个队列存储需要监控的网址,然后监控程序不断地 使用RPOPLPUSH命令循环取出一个网址来测试可用性。这里使用RPOPLPUSH命令的好处在 于在程序执行过程中仍然可以不断地向网址列表中加入新网址,而且整个系统容易扩展,允 许多个客户端同时处理队列。
set(集合)
介绍
集合(set)和列表(list)的区别是集合是无序的,集合是唯一的。
基本操作
-
SADD
用来向集合中增加一个或多个元素,如果键不存在则会自动创建。因为在一个 集合中不能有相同的元素,所以如果要加入的元素已经存在于集合中就会忽略这个元素。本 命令的返回值是成功加入的元素数量(忽略的元素不计算在内)。 -
SREM
用来从集合中删除一个或多个元素,并返回删除成功的个数。 -
SMEMBERS
返回集合中的所有元素。 -
SISMEMBERS
判断一个元素是否在集合中是一个时间复杂度为0(1)的操作,无论集合中有多少个元 素,SISMEMBER命令始终可以极快地返回结果。当值存在时SISMEMBER命令返回1,当值不 存在或键不存在时返回0。 -
SDIFF
用来对多个集合执行差集运算。集合A与集合B的差集表示为A-B,代表所 有属于A且不属于B的元素构成的集合,即A-B={x|x∈A且x∈/B}。 -
SINTER
用来对多个集合执行交集运算。集合A与集合B的交集表示为A∩B,代表 所有属于A且属于B的元素构成的集合,即A∩B={x|x∈A且x∈B}。 -
SUNION
用来对多个集合执行并集运算。集合A与集合B的并集表示为AUB,代表 所有属于A或属于B的元素构成的集合(如图3-15所示),即AUB={x|x∈A 或x∈B}。 -
SCARD
获得集合中元素个数。 -
SDIFFSTORE
,SINTERSTORE
,SUNIONSTORE
SDIFFSTORE命令和SDIFF命令功能一样,唯一的区别就是前者不会直接返回运算结果,而是将结果存储在destination键中。 -
SRANDMEMBER
(SRANDMEMBER key [count])随机获得集合里的元素还可以传递count参数来一次随机获得多个元素,根据count的正负不同,具体表现也不同。 (1)当count为正数时,SRANDMEMBER会随机从集合里获得count个不重复的元素。如果 count的值大于集合中的元素个数,则SRANDMEMBER会返回集合中的全部元素。 (2)当count为负数时,SRANDMEMBER会随机从集合里获得|count|个的元素,这些元素有 可能相同。 -
SPOP
从集合中 随机选择一个元素弹出。
使用
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合 类型在Redis内部是使用值为空的散列表(hash table)实现的,所以这些操作的时间复杂度都是 0(1)。最方便的是多个集合类型键之间还可以进行并集、交集和差集运算,稍后就会看到灵活 运用这一特性带来的便利。
sorted set(有序集合)
介绍
在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数,这使得我们 不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高 (或最低)的前N个元素、获得指定分数范围内的元素等与分数有关的操作。虽然集合中每个元 素都是不同的,但是它们的分数却可以相同。
和列表的比较
有序集合类型在某些方面和列表类型有些相似:
(1)二者都是有序的。
(2)二者都可以获得某一范围的元素。
但是二者有着很大的区别,这使得它们的应用场景也是不同的:
(1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问 中间数据的速度会较慢,所以它更加适合实现如“新鲜事”或“日志”这样很少访问中间元素的 应用。
(2)有序集合类型是使用散列表和跳跃表(Skip list)实现的,所以即使读取位于中间部分 的数据速度也很快(时间复杂度是O(log(N)))。
(3)列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更改这个元素的分 数)。
(4)有序集合要比列表类型更耗费内存。 有序集合类型算得上是 Redis的5种数据类型中最高级的类型了,在学习时可以与列表类 型和集合类型对照理解。
基本操作
-
ZADD
(ZADD key score member [score member …])ZADD命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会 用新的分数替换原有的分数。ZADD命令的返回值是新加入到集合中的元素个数(不包含之前 已经存在的元素)。 -
ZSCORE
获得元素的分数 -
ZRANGE
(ZRANGE key start stop [WITHSCORES])ZRANGE命令会按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包 含两端的元素)。ZRANGE命令与LRANGE命令十分相似,如索引都是从0开始,负数代表从后 向前查找(-1表示最后一个元素)。如果需要同时获得元素的分数的话可以在ZRANGE命令的尾部加上WITHSCORES参数, 这时返回的数据格式就从“元素1, 元素2, …, 元素n”变为了“元素1, 分数1, 元素2, 分数2, …, 元 素n, 分数n”。ZRANGE命令的时间复杂度为0(logn+m)(其中n为有序集合的基数,m为返回的元素个 数)。 如果两个元素的分数相同,Redis会按照字典顺序(即"0"<"9"<"A"<"Z"<"a"<"z"这样 的顺序)来进行排列。再进一步,如果元素的值是中文怎么处理呢?答案是取决于中文的编码 方式 -
ZREVRANGE
ZREVRANGE命令和ZRANGE的唯一不同在于ZREVRANGE命令是按照元素分数从大到 小的顺序给出结果的。 -
ZRANGEBYSCORE
(ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count])ZRANGEBYSCORE命令参数虽然多,但是都很好理解。该命令按照元素分数从小到大的 顺序返回分数在min和max之间(包含min和max)的元素。如果希望分数范围不包含端点值,可以在分数前加上“(”符号。 -
ZINCRBY
(ZINCRBY key increment member)ZINCRBY命令可以增加一个元素的分数,返回值是更改后的分数。如果指定的元素不存在,Redis在执行命令前会先建立它并将它的分数赋为0再执行操作。 -
ZCARD
获得集合中元素的数量 -
ZCOUNT
(ZCOUNT key min max)2.获得指定分数范围內的元素个数 -
ZREM
删除一个或多个元素 -
ZREMRANGEBYRANK
(ZREMRANGEBYRANK key start stop)按照元素分数从小到大的顺序(即索引0表示最小的值)删除 处在指定排名范围内的所有元素,并返回删除的元素数量。 -
ZREMRANGEBYSCORE
按照分数范围删除元素 -
ZRANK
获得元素的排名 -
ZINTERSTORE
计算有序集合的交集。<font color="red">注意:有点复杂,用到的时候再说</font>