redis 不同数据结构使用场景

String

使用场景:

1.缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。

2.计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。

3.session:常见方案spring session + redis实现session共享。

hash

 

hash在实际项目中有可能多表 关联查询,redis怎么存:可以sql先关联起来,然后存到视图,redis存视图里面的数据

package com.huadian.Hash;
 
import com.huadian.redisUntil.JedisPoolUntil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
 
import java.util.HashMap;
import java.util.Map;
 
public class HashDemo {
    private Jedis jedis = null;
    @Before
    public void fun(){
         jedis = JedisPoolUntil.getJedis();
    }
 
    /**
     * Redis Hset 命令用于为哈希表中的字段赋值 。
 
     如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
 
     如果字段已经存在于哈希表中,旧值将被覆盖。
 
     redis 127.0.0.1:6379> HSET KEY_NAME FIELD VALUE
     */
    @Test
    public void add(){
        Long hset = jedis.hset("user", "name", "王二");
        System.out.println(hset);
    }
 
    /**
     * Redis Hmset 命令用于同时将多个 field-value (字段-值)对设置到哈希表中。
 
     此命令会覆盖哈希表中已存在的字段。
 
     如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。
 
     redis 127.0.0.1:6379> HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUEN
     */
    @Test
    public void addMore(){
        Map<String ,String>map = new HashMap<>();
        map.put("name","cpf");
        map.put("position","java");
        map.put("salary","100");
        String student = jedis.hmset("student", map);
        System.out.println(student);
    }
 
    /**
     * Redis Hdel 命令用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。
     *
     * redis 127.0.0.1:6379> HDEL KEY_NAME FIELD1.. FIELDN
     */
    @Test
    public void del(){
        Long student = jedis.del("student");
        System.out.println(student);
    }
 
    /**
     * Redis Hdel 命令用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。
     *
     * redis 127.0.0.1:6379> HDEL KEY_NAME FIELD1.. FIELDN
     */
    @Test
    public void del1(){
        Long student = jedis.hdel("student","salary","age");
        System.out.println(student);
    }
 
 
    /**
     * Redis Hincrbyfloat 命令用于为哈希表中的字段值加上指定浮点数增量值。
 
     如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。
 
     redis 127.0.0.1:6379> HINCRBYFLOAT KEY_NAME FIELD_NAME INCR_BY_NUMBER
     */
    @Test
    public void modify(){
        Long aLong = jedis.hincrBy("student", "salary", 100);
        Double aDouble = jedis.hincrByFloat("student", "salary", 100);
        System.out.println(aDouble);
    }
 
    /**
     * Redis Hget 命令用于返回哈希表中指定字段的值。
     *
     * redis 127.0.0.1:6379> HGET KEY_NAME FIELD_NAME 
     */
    @Test
    public void getMore(){
        String hget = jedis.hget("student", "salary");
        System.out.println(hget);
    }
 
    @After
    public void fun1(){
        jedis = JedisPoolUntil.getJedis();
    }
}

list 

排行榜

  list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中,如京东每日的手机销量排行、学校每次月考学生的成绩排名、斗鱼年终盛典主播排名等,下图是酷狗音乐“K歌擂台赛”的昨日打擂金曲排行榜,每日计算一次,存储在list类型中,接口访问时,通过page和size分页获取打擂金曲。(打个小广告,酷狗音乐“K歌擂台赛”每天都能产生一批优质翻唱作品,对普通人优质歌声有兴趣的朋友不妨来听听)。

最新列表

  list类型的lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表,如朋友圈的点赞列表、评论列表。

  但是,并不是所有的最新列表都能用list类型实现,因为对于频繁更新的列表,list类型的分页可能导致列表元素重复或漏掉,举个例子,当前列表里由表头到表尾依次有(E,D,C,B,A)五个元素,每页获取3个元素,用户第一次获取到(E,D,C)三个元素,然后表头新增了一个元素F,列表变成了(F,E,D,C,B,A),此时用户取第二页拿到(C,B,A),元素C重复了。只有不需要分页(比如每次都只取列表的前5个元素)或者更新频率低(比如每天凌晨更新一次)的列表才适合用list类型实现。对于需要分页并且会频繁更新的列表,需用使用有序集合sorted set类型实现。另外,需要通过时间范围查找的最新列表,list类型也实现不了,也需要通过有序集合sorted set类型实现,如以成交时间范围作为条件来查询的订单列表。之后在介绍有序集合sorted set类型的应用场景时会详细介绍sorted set类型如何实现最新列表。

  那么问题来了,对于排行榜和最新列表两种应用场景,list类型能做到的sorted set类型都能做到,list类型做不到的sorted set类型也能做到,那为什么还要使用list类型去实现排行榜或最新列表呢,直接用sorted set类型不是更好吗?原因是sorted set类型占用的内存容量是list类型的数倍之多(之后会在容量章节详细介绍),对于列表数量不多的情况,可以用sorted set类型来实现,比如上文中举例的打擂金曲排行榜,每天全国只有一份,两种数据类型的内存容量差距可以忽略不计,但是如果要实现某首歌曲的翻唱作品地区排行榜,数百万的歌曲,300多个地区,会产生数量庞大的榜单,或者数量更加庞大的朋友圈点赞列表,就需要慎重地考虑容量的问题了

set(set /sorted set)

set

1. 好友/关注/粉丝/感兴趣的人集合

  set类型唯一的特点使得其适合用于存储好友/关注/粉丝/感兴趣的人集合,集合中的元素数量可能很多,每次全部取出来成本不小,set类型提供了一些很实用的命令用于直接操作这些集合,如

    a. sinter命令可以获得A和B两个用户的共同好友

        b. sismember命令可以判断A是否是B的好友

        c. scard命令可以获取好友数量

        c. 关注时,smove命令可以将B从A的粉丝集合转移到A的好友集合

2. 随机展示

  通常,app首页的展示区域有限,但是又不能总是展示固定的内容,一种做法是先确定一批需要展示的内容,再从中随机获取。如下图所示,酷狗音乐K歌擂台赛当日的打擂歌曲共29首,首页随机展示5

3. 黑名单/白名单

  经常有业务出于安全性方面的考虑,需要设置用户黑名单、ip黑名单、设备黑名单等,set类型适合存储这些黑名单数据,sismember命令可用于判断用户、ip、设备是否处于黑名单之中。

首;昨日打擂金曲共200首,首页随机展示30首

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值