Redis:三、Key和Value

1 Redis的值value(数据结构类型)

  Redis的数据结构类型,指的就是redis的值value的类型

  Redis常用的数据结构类型:string、list、set、sortedSet、hash

2 Redis的键key

2.1 key的类型

  redis的key 值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。

  空字符串也是有效key值。

  redis建议使用字符串做为key的类型

2.2 key取值规范

  (1)键值不需要太长,消耗内存,在数据中查找这类键值的计算成本较高

  (2)键值不宜过短,可读性较差,通常建议见名知意

2.2.1 取值举例

  将如下数据库表中的数据,转换为redis的key-value存储

id

username

password

email

1

lisi

111111

lisi@163.com

127.0.0.1:6379> set user:id:1:username lisi

OK

127.0.0.1:6379> set user:id:1:password 111111

OK

127.0.0.1:6379> set user:id:1:email lisi@163.com

OK

127.0.0.1:6379> keys user:id:1* #查找有几个属性

1) "user:id:1:password"

2) "user:id:1:username"

3) "user:id:1:email"

127.0.0.1:6379>

2.3 Key命令

exists key

    检查给定key是否存在。注意事项,不支持通配符

del key

    删除一个key

del key1 key2 key3  删除多个key

keys pattern (模糊查找)

    查找所有符合给定模式 pattern 的 key 。

    keys * 匹配数据库中所有 key 。

    keys n?me 匹配 name、neme、nfme 等。

    keys n* 匹配 name、neme、naaaaame等。

    keys n[ae]me 只能匹配 name、neme。

expire key seconds

    指定key的过期时间。

    新添加的key,如果没有指定过期时间,则会一直保存。

    可以对一个已经带有生存时间的key执行EXPIRE命令,新指定的生存时间会取代旧的生存时间。

ttl key   (time to live)

    查看某个key的剩余过期时间,返回值:

    -2 表示这个key已经过期,删除掉

    -1 表示没有设置过期时间

    其它 表示剩余的生存时间,单位为秒。

rename

    语法格式:rename key newkey

    将 key 改名为 newkey 。

    当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。

    当 newkey 已经存在时, RENAME 命令将覆盖旧值。

type key

  查看key对应的value的数据结构类型。

  其它key命令见redis帮助文档   http://doc.redisfans.com/

get key

  查看某一个key的值

2.4 string类型

        string类型是redis最常用的数据结构类型,存储的值为字符串。

2.4.1 String相关命令

set key value

    设置一个key,值为value,类型为String类型;如果这个key已经存在,则更新这个key的值。

    返回值

        1 表示成功

        0 表示失败

setnx key value

    如果这个key不存在,则设置一个key,值为value;如果key存在,则不做更新。

    返回值

        1 表示成功

        0 表示失败

get key

    获取key对应的value值;如果key不存在,则返回nil

mget key1 key2 key3

    一次获取多个key的值,如果对应key不存在,则对应返回nil。

incr key

    将 key 中储存的数字值增一,然后返回。

    如果这个key不存在,那么key的值会先被初始化为0,然后再执行INCR操作。

    如果这个key对应的value值,不能表示数字,则会返回一个错误。

incrby key increment

    将key增加指定的步长值。

decr key

    将 key 中储存的数字值减一,然后返回。

    如果这个key不存在,那么key的值会先被初始化为0,然后再执行INCR操作。

    如果这个key对应的value值,不能表示数字,则会返回一个错误。

    Redis的key是单线程模式,这就意味一瞬间只有一个线程能够持有这个key,所以可以使用redis解决部分涉及线程安全的业务。

    (1)在实际的开发过程中,如果涉及到多线程安全问题。能不加锁,尽量不加锁。因为加锁效率低(需要频繁去判断是否存在锁;要不断的等待|唤醒)

    (2)对于线程加锁的问题,可以考虑使用redis来解决。原因:redis的key是单线程模式。

decrby key decrement

    将key减少对应的步长值。

append key value

    如果key已经存在,则将value追加到这个key原先的value值的末尾。

    如果这个key不存在,则执行set操作。

127.0.0.1:6379> help @string 查看string类型的帮助文档

127.0.0.1:6379> help set   查看set命令的帮助文档

2.4.2 String类型的应用场景

  (1)、做与统计有关的业务,如新浪微博(微信朋友圈)中的点赞功能

  (2)解决多线程的线程安全问题。

    Redis的key是单线程模式,这就意味一瞬间只有一个线程能够持有这个key,所以可以使用redis解决部分涉及线程安全的业务,比如说抢购、秒杀。

2.5 List类型

2.5.1 特点

  (1)、基于Linked List实现

  (2)、元素是字符串类型

  (3)、列表头尾增删快,中间增删慢,增删元素是常态

  (4)、元素可以重复出现

  (5)、最多包含2^32-1元素

wps2

  列表的索引

    从左至右,从0开始

    从右至左,从-1开始

wps3

2.5.2 List类型相关命令

lpush key value [value ...]

  将一个或多个值value插入到列表key的表头(即从左边插入);

  如果有多个value值,那么各个value值按从左到右的顺序依次插入到表头:比如说,对空列表mylist执行命令LPUSH mylist a b c,列表的值将是 c b a 这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令;

  如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。

  当 key 存在但不是列表类型时,返回一个错误。

rpush key value [value ...]

  尾部添加(从右向左),操作同上。

llen key

  返回key对应list的长度,key不存在返回0,如果key对应类型不是list返回错误

lindex key index

  index元素在list列表中的下角标,从0开始;

  lindex  是从左到右取元素

lrange key start stop

  获取指定区间的所有元素;

  下角标从0开始,0表示第一个元素,1表示第二个,依次类推;

  -1表示最后一个元素,-2表示倒数第二个元素,依次类推;

lpop key  

  移除并返回列表中的第一个元素

rpop key  

  移除并返回列表中的最后一个元素。

2.5.3 List类型应用场景

  (1)处理排名类业务。如新浪微博评论、论坛回帖楼层等。

  (2)聊天室

2.6 Hash类型(散列)

2.6.1 特点

wps4

  (1)由Field和与之关联的value组成map键值对

  (2)field和value是字符串类型

  (3)一个hash中最多包含2^32-1键值对。

2.6.2 Hash相关命令

hset key field value

  设置hash field为指定值,如果key不存在,则先创建

  如果field已经存在,那么将更新这个field的值。

hget key field 

  获取指定的hash field

hmget key filed1....fieldN

  获取全部指定的hash filed

hmset key filed1 value1 ... filedN valueN

  同时设置hash的多个field

hexists key field

  测试指定field是否存在

hdel key field [field ...]

  删除指定的hash field

hlen key

  返回指定hash的field数量

hkeys key

  返回hash的所有field

hvals key

  返回hash的所有value

hgetall key

  返回hash的所有filed和value

2.6.3 Hash的用途(能使用hash的时候尽量使用hash)

  节约内存空间

    redis每创建一个键,都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等)

    redis的key相对于值来说,更珍贵!!!

    所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,在获取key对应的value值时cpu的开销也会更多

    Hash结构可以将具有关联关系的一组key-value,存储到同一个hash结构中,从而减少key的数量。

wps5

2.6.4 hash不适用的场景

  如果我们仅仅只对一个字段设置过期,就不建议使用hash。

  Redis的key的过期功能只能对键操作,而Hash结构不能单独对某一个filed设置过期功能。

  说明:在实际开发中,能使用hash的时候,尽量使用hash!!

2.7 Set类型(集合)

2.7.1 特点

wps6

  (1)无序的、去重的;

  (2)元素是字符串类型;

  (3)最多包含2^32-1元素。

2.7.2 Set相关命令

sadd key member [member ...](无序不重复)

  将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。

  假如 key 不存在,则创建一个只包含 member 元素作成员的集合。

  当 key 不是集合类型时,返回一个错误。

smembers key

  返回集合 key 中的所有成员。

  不存在的 key 被视为空集合。

spop key

  移除并返回集合中的一个随机元素。

  被移除的随机元素。

  当key不存在或key是空集时,返回nil。

scard key

  返回集合key的基数(集合中元素的数量)。

  集合的基数。

  当key不存在时,返回0。

  交集、并集、差集sinter sunion sdiff

sinter key [key ...]

  返回一个集合的全部成员,该集合是所有给定集合的交集。

  不存在的 key 被视为空集。

sunion key [key ...]

  返回一个集合的全部成员,该集合是所有给定集合的并集。

  不存在的 key 被视为空集。

sdiff key [key ...]

  返回一个集合的全部成员,该集合是所有给定集合之间的差集。

  不存在的 key 被视为空集。

2.7.3 应用场景

  (1)微博共同关注

    需求:当用户访问另一个用户的时候,会显示出两个用户共同关注哪些相同的用户

    设计:将每个用户关注的用户放在集合中,求交集即可

    实现如下:

      peter={'john','jack','may'}

      ben={'john','jack','tom'}

      那么peter和ben的共同关注为:

      SINTER peter ben 结果为{'john','jack'}

2.8 SortedSet类型

2.8.1 特点

wps8

  (1)类似Set集合;

  (2)有序的、去重的;

  (3)元素是字符串类型;

  (4)每一个元素都关联着一个浮点数分值(Score),并按照分值从小到大的顺序排列集合中的元素。分值可以相同

  (5)最多包含2^32-1元素

help @sorted_set 查看sortedset的帮助文档

zadd key  [score member score member] :增加值

  如: zadd set1 1 zhangsan 2 lisi

zcount key start end 统计一个范围内元素的个数

  如: zcount set1 0 10

zcard key  :统计元素的个数

  如 : zcard set1

zrank key member:返回成员的索引号

  如: zrank set1 zhangsan

zrem  key [member member] 删除成员

  如: zrem set1 zhangsan

zincrby key increment member 以increment作为步长增加member的score

  如: zincrby set1 zhangsan

zrange key start stop [WITHSCORES]  查找下标以start开始,stop结束的member(如果加上参数WITHSCORES,则连score一起显示)

wps9

zrevrange key start stop [WITHSCORES] 反转zrange的数据

wps10

zscore key member 获得指定member的score

wps11

2.8.2 适用场景

适用于需要有序且唯一的业务或操作:

  (1)音乐排行榜

    分析:

      每首歌的歌名作为元素(唯一、不重复)

      每首歌的播放次数作为分值

      ZREVRANGE来获取播放次数最多的歌曲(就是最多播放榜了,云音乐热歌榜,没有竞价,没有权重)

posted @ 2019-07-22 20:31  请输入名字  阅读(17023)  评论(0编辑  收藏  举报