reids基础

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可以存储2^{32}-1 键值对

基本操作

  • 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,SUNIONSTORESDIFFSTORE命令和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"这样 的顺序)来进行排列。再进一步,如果元素的值是中文怎么处理呢?答案是取决于中文的编码 方式
  • ZREVRANGEZREVRANGE命令和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>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容