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
1lisi111111lisi@163
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
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 * 匹配数据库中所有 key 。
keys n?me 匹配 name、neme、nfme 等。
keys n* 匹配 name、neme、naaaaame等。
keys n[ae]me 只能匹配 name、neme。
expire key seconds
指定key的过期时间。
新添加的key,如果没有指定过期时间,则会⼀直保存。
可以对⼀个已经带有⽣存时间的key执⾏命令,新指定的⽣存时间会取代旧的⽣存时间。
ttl key  (time to live)
查看某个key的剩余过期时间,返回值:
-2 表⽰这个key已经过期,删除掉
-1 表⽰没有设置过期时间
其它表⽰剩余的⽣存时间,单位为秒。
rename
语法格式:rename key newkey
将 key 改名为 newkey 。
当 key 和 newkey 相同,或者 key 不存在时,返回⼀个错误。
当 newkey 已经存在时,命令将覆盖旧值。
type key
  查看key对应的value的数据结构类型。
  其它key命令见redis帮助⽂档
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元素
  列表的索引
    从左⾄右,从0开始
    从右⾄左,从-1开始
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
redis支持的数据结构  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 特点
  (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 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的开销也会更多

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。