Redis redis五种数据类型和使用场景

一、redis基本基本介绍

1、 redis解决分布式环境下缓存不同步
让缓存集中处理(大家使用同一个缓存服务),我们需要一个类似于MYSQL这样可以通过服务来提供第三方的缓存工具(缓存服务器);流行的第三方缓存服务器:memcache/redis
2、REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统(可以把redis想象成一个巨大的MAP)。Redis和ehcache不一样的是,ehcache可以看做一个嵌入式的缓存框架,而redis是一个独立的应用服务(像MYSQL一样),既可以提供缓存功能,还可以把数据持久化到磁盘上(redis也可以提供持久化的功能,在某些情况下,redis也可以作为数据库存在);
3、性能极高 – Redis能支持超过 10W次每秒的读写频率。丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行(简单的事务)。
丰富的特性 – Redis还支持 publish/subscribe(发布/订阅), 通知, key 过期等等特性。

二、redis基本命令和存储

redis命令分为:
  对数据的操作;
  发布/订阅相关操作;
  事务控制;
  脚本命令;
  连接服务器命令;
  数据库服务相关命令;
redis存储:
1,redis可以作为内存数据库,也可以把数据持久化到磁盘上;大部分情况下,都是把redis作为内存数据库;
2,默认情况下
  #after 900 sec (15 min) if at least 1 key changed
  #after 300 sec (5 min) if at least 10 keys changed
  #after 60 sec if at least 10000 keys changed
在redis配置文件中:
  save 900 1
  save 300 10
  save 60 10000
3,数据默认存储在安装目录下.rdb文件中(可以在配置文件中dbfilename dump.rdb配置);
4,redis也可以设置为append模式,每次key的修改都会append到文件中,这种方式有可能丢失60秒的数据;
  通过配置:appendonly yes开启
  appendfilename "appendonly.aof"设置append文件;
  可以设置append的模式(类似于mysql的事务文件同步机制):
     # appendfsync always:每次更新key及时同步到append文件;
     # appendfsync everysec:每一秒同步一次key的更新;
    # appendfsync no:不管理append文件的更新,根据操作系统去定

三、redis中String数据类型 http://redis.cn/commands.html#string

1、常见的字符串操作:
  strlen key:返回key的value的值长度;
  getrange key X Y:返回key对应value的一个子字符串,位置从X到Y;
  append key value:给key对应的value追加值,如果key不存在,相当于set一个新的值;
2、如果字符串的内容是数值(integer,在redis中,数值也是string)
  incr key:在给定key的value上增加1;(常用于id);redis中的incr是一个原子操作,支持并发;如果key不存在,则相当于设置1;
  incrby key value:给定key的value上增加value值;相当于key=key.value+value;这也是一个原子操作;
  decr:在给定key的value上减少1;
  decrby key value:给定key的value上减少value值;
3、string最常见的使用场景:
存储json类型对象
  incr user:id
  set user:1 {id:1,name:xiaolong}   第一个user设置属性
   incr user:id  incr 是原子操作,支持并发
  set user:2 {id:2,name:stef}  第二个user设置属性
作为计数器,
  incr count;
优酷视频点赞(为第100个视频点赞统计)
   初   始   set vedio:100:goodcount 0
   点   赞   incr vedio:100:good:count
  取消点赞   decr vedio:100:good:count

四、redis中的List http://redis.cn/commands.html#list

1、redis的LIST结构(想象成java中的List),是一个双向链表结构,可以用来存储一组数据;从这个列表的前端和后端取数据效率非常高;
2、list的常用操作:
  RPUSH:在一个list最后添加一个元素
RPUSH firends “stef”
  LPUSH:在一个list最前面添加一个元素
LPUSH firends “stea”
  LTRIM key start stop:剪裁一个列表,剩下的内容从start到stop;
LTRIM friends 0,3 =>只剩下前4个数据;
  LRANGE key start stop:获取列表中的一部分数据,两个参数,第一个参数代表第一个获取元素的位置(0)开始,第二个值代表截止的元素位置,如果第二个参数为-1,截止到列表尾部==>LRANGE firends 0 -1
  LLEN key: 返回一个列表当前长度==>LLEND friends
  LPOP:移除list中第一个元素,并返回这个元素==>LPOP friends
  RPOP:移除list中最后一个元素,并返回这个元素==>RPOP friends
在这里插入图片描述
3,使用场景:
①可以使用redis的list模拟队列,堆栈
②朋友圈点赞;
 规定:朋友圈内容的格式:
    内容: user❌post:x content来存储;
    点赞: post❌good list来存储;
 创建一条微博内容:set user:1:post:91 ‘hello redis’;
 点赞:
     lpush post:91:good ‘{id:1,name:stef,img:xxx.jpg}’
     lpush post:91:good ‘{id:2,name:xl,img:xxx.jpg}’
     lpush post:91:good ‘{id:3,name:xm,img:xxx.jpg}’
③查看有多少人点赞: llen post:91:good
④查看哪些人点赞:lrange post:91:good 0 -1
思考,如果用数据库实现这个功能,SQL会多复杂??

示例2:回帖
  ①创建一个帖子:
    set user:1:post:90 ‘wohenshuai’
  ②创建一个回帖:
    set postreply:1 ‘nonono’
  ③把回帖和帖子关联:
    lpush post:90:replies 1
  ④再来一条回帖:
    set postreply:2 ‘hehe’
     lpush post:90:replies 2
 ⑤查询帖子的回帖:
    lrange post:90:replies 0 -1
     get postreply:2

五、redis中的Set http://redis.cn/commands.html#set

1、SET结构和java中差不多,数据没有顺序,并且每一个值不能重复;
2、SET结构的常见操作:
    SADD:给set添加一个元素==>SADD language ‘java’
    SREM:从set中移除一个给定元素==>SREM language ‘php’
    SISMEMBER:判断给定的一个元素是否在set中,如果存在,返回1,如果不存在,返回0==>sismember language ‘php’
    SMEMBERS:返回指定set内所有的元素,以一个list形式返回==>smembers language
    SCARD:返回set的元素个数==>scard language
    SRANDMEMBER key count:返回指定set中随机的count个元素==> srandmember friends 3 //随机推荐3个用户(典型场景,抽奖)
    SUNION(并集):综合多个set的内容,并返回一个list的列表,包含综合后的所有元素;
         sadd language ‘php’
         sadd pg ‘c’
         sadd pg ‘c++’
         sadd pgs ‘java’
         sadd pgs ‘swift’
         sunion language pg pgs
    SINTER key [key …] (交集):获取多个key对应的set之间的交集
SINTER friends:user:1000 friends:user:1001 friends:user:1002 =>获取1000,1001,1002三个用户的共同好友列表;
     SINTERSTORE destination key [key …] :获取多个key对应的set之间的交集,并保存为新的key值;目标也是一个set;
SINTER groupfriends friends:user:1000 friends:user:1001 friends:user:1002 =>获取三个用户共同的好友列表并保存为组好友列表;
3、set的使用场景:
①、去重;
②、抽奖;
    准备一个抽奖池:sadd luckdraws 1 2 3 4 5 6 7 8 9 10 11 12 13
    抽3个三等奖:srandmember luckdraws 3
srem luckdraws 11 1 10
    抽2个二等奖:
三、做set运算(好友推荐)
    初始化好友圈
          sadd user:1:friends ‘user:2’ ‘user:3’ ‘user:5’
          sadd user:2:friends ‘user:1’ ‘user:3’ ‘user:6’
          sadd user:3:friends ‘user:1’ ‘user:7’ ‘user:8’
    把user:1的好友的好友集合做并集;
         user:1 user:3 user:6 user:7 user:8
    让这个并集和user:1的好友集合做差集;
         user:1 user:6 user:7 user:8
    从差集中去掉自己
          user:6 user:7 user:8
    随机选取推荐好友
在这里插入图片描述
在这里插入图片描述

六、redis中的Sort Set http://redis.cn/commands.html#sorted_set

1、SET是一种非常方便的结构,但是数据无序,redis提供了一个sorted set,每一个添加的值都有一个对应的分数,可以通过这个分数进行排序;sorted set中的排名是按照分组升序排列
2、Sortedset的常用操作:
   ZADD:添加一个带分数的元素,也可以同时添加多个:
        ZADD hackers 1940 “Alan Kay”
        ZADD hackers 1906 “Grace Hopper”
        ZADD hackers 1969 “Linus Torvalds”
        ZADD hackers 1940 “Alan Kay” 1906 “Grace Hopper” 1969 “Linus Torvalds”
   ZCOUNT key min max :给定范围分数的元素个数:
   ZCOUNT hackers 1940 1960 =>1940到1960的hacker个数;
   ZRANK key member :查询指定元素的分数在整个列表中的排名(从0开始)
   ZRANK hackers “Alan Kay” =>alan kay的年龄在所有hacker中的排名;
   zrange hackers 0 -1 =>
     1) “Grace Hopper”
     2) “Alan Kay”
     3) “Linus Torvalds”
   ZREVRANGE key start stop:按照分数从小到大排;
3、sorted set的使用场景:sorted set算是redis中最有用的一种结构,非常适合用于做海量的数据的排行(比如一个巨型游戏的用户排名);sorted set中所有的方法都建议大去看一下;sorted set的速度非常快;
示例1,天梯排名:
  1,添加初始排名和分数:
  2,查询fat在当前ladder中的排名:
  3,查询ladder中的前3名:
  4,jian增加了20ladder score: 在这里插入图片描述
示例2:
   LRU淘汰最长时间没使用;
   LFU淘汰最低使用频率;

七、redis中的hash http://redis.cn/commands.html#hash

1、hashes可以理解为一个map,这个map由一对一对的字段和值组成,所以,可以用hashes来保存一个对象:
2、hashes的常见操作:
 HSET:给一个hashes添加一个field和value;
    HSET user:1000 name “John Smith”
    HSET user:1000 email "john.smith@example.com"
    HSET user:1000 password “s3cret”
 HGET可以得到一个hashes中的某一个属性的值:
    HGET user:1000 name =>“John Smith”
 HGETALL:一次性取出一个hashes中所有的field和value,使用list输出,一个field,一个value有序输出;
   HGETALL user:1000 =>
    1) “name”
    2) “John Smith”
    3) “email”
    4) "john.smith@example.com"
    5) “password”
    6) “s3cret”
 HMSET:一次性的设置多个值(hashes multiple set)
    HMSET user:1001 name “Mary Jones” password “hidden” email "mjones@example.com"
 HMGET:一次性的得到多个字段值(hashes multiple get),以列表形式返回;
    HMGET user:1001 name email =>
    1)“Mary Jones”
    2)“mjones@example.com”
 HINCRBY:给hashes的一个field的value增加一个值(integer),这个增加操作是原子操作:
    HSET user:1000 visits 10
    HINCRBY user:1000 visits 1 => 11
    HINCRBY user:1000 visits 10 => 21
 HKEYS:得到一个key的所有fields字段,以list返回:
    HKEYS user:1000 =>
    1)“name”
    2)“password”
    3)“email”
 HDEL:删除hashes一个指定的filed;
    HDEL user:1000 visits
3、使用场景:
  使用hash来保存一个对象更直观;(建议不使用hash来保存)
  分组
     set user:id 1
    set dept:id 1
    HMSET ids user:id 1 dept:id 1 orderbill:id 1
    HINCRBY ids user:id
    HINCRBY ids dept:id
    HMSET users user:1 “{id:1,name:xx}” user:2 “{id:2,name:xx}”
学redis:
redis在线入门 : http://try.redis.io/
redis 中文资料站: http://www.redis.cn/
redis 命令手册: http://www.redisdoc.com/en/latest/index.html

  • 10
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值