Redis数据类型存取和使用情况

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

彩色的用java读写,然后存黑色的代码用的是redis客户端终端命令

  1. String(字符串)
  • string是Redis最基本的类型,它可以包含任何数据,一个键最大能存储512MB

  • 常用命令的时间复杂度为O(1),读写一样的快。

应用场景:很常见的场景用于统计网站访问数量,当前在线人数等。

写:

redisTemplate.opsForValue().set(key, String.valueOf(value));

读:

redisTemplate.opsForValue().get(key);
 @Autowired
 private RedisTemplate<String, String> redisTemplate;
 
    /**
     * 设置缓存
     * @param key     键
     * @param value   值
     * @param timeout  时长
     * @param timeUnit 缓存时间的类型(时/分/秒)
     */
    public void set(String key, Object value, Long timeout, TimeUnit timeUnit) {
        // 写入String缓存
        redisTemplate.opsForValue().set(key, String.valueOf(value));
        // 设置缓存时效
		if (timeout != null) {
		    if (timeUnit != null) {
		        redisTemplate.expire(key, timeout, timeUnit);
		     } else {
		        redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
		    }
		 }
	}

    /**
     * 通过key获取value缓存
     */
    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

redis 127.0.0.1:6379> SET name "Hello redis!"
OK
redis 127.0.0.1:6379> GET name
"Hello redis!"
  1. List类型

应用场景:1.***消息排行榜。2.消息队列,以完成多程序之间的消息交换。可以用push操作将任务存在list中(生产者),然后线程在用pop操作将任务取出进行执行。(消费者)

写:

// 写入List缓存;rightPush和leftPusp的区别在于(在一个数的右边加入还是左边加入)
redisTemplate.opsForList().rightPushAll(key, value);

读:

redisTemplate.opsForList().range(key, 0, redisTemplate.opsForList().size(key));
@Autowired
 private RedisTemplate<String, String> redisTemplate;
 
    /**
     * 设置List缓存
     * @param key     键
     * @param value   值
     * @param timeout  时长
     * @param timeUnit 缓存时间的类型(时/分/秒)
     */
    public void setList(String key, List<String> value, Long timeout, TimeUnit timeUnit) {
        // 写入List缓存;rightPush和leftPusp的区别在于(在一个数的右边加入还是左边加入)
        redisTemplate.opsForList().rightPushAll(key, value);
        // 在某段时间后失效
        if (timeout != null) {
            if (timeUnit != null) {
                redisTemplate.expire(key, timeout, timeUnit);
            } else {
                redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
            }
        }
    }
	/**
     * 通过key获取value缓存
     */
    public List<String> getList(String key) {
        List<String> value = redisTemplate.opsForList().range(key, 0, redisTemplate.opsForList().size(key));
        return value;
    }

0-3
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(lpush)或者尾部(rpush)。

127.0.0.1:6379> lpush mylist first
(integer) 1
127.0.0.1:6379> lpush mylist second
(integer) 2
127.0.0.1:6379> rpush mylist third
(integer) 3
127.0.0.1:6379> lrange mylist 0 3
1) "second"
2) "first"
3) "third"

  1. Set类型(不可重复的无序集合)

应用场景:1.利用交集求共同好友。2.利用唯一性,可以统计访问网站的所有独立IP。3.好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐。

写:

redisTemplate.opsForSet().add(key, value);

读:

redisTemplate.opsForSet().members(key);
@Autowired
 private RedisTemplate<String, String> redisTemplate;
 
    /**
     * 设置List缓存
     * @param key     键
     * @param value   值
     * @param timeout  时长
     * @param timeUnit 缓存时间的类型(时/分/秒)
     */
    public void setSet(String key, String[] value, Long timeout, TimeUnit timeUnit) {
        // 写入Set缓存
        redisTemplate.opsForSet().add(key, value);
        // 在某段时间后失效
        if (timeout != null) {
            if (timeUnit != null) {
                redisTemplate.expire(key, timeout, timeUnit);
            } else {
                redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
            }
        }
    }
	/**
     * 通过key获取value缓存
     */
    public Set<String> getSet(String key) {
        Set<String> value = redisTemplate.opsForSet().members(key);
        return value;
    }

Redis的Set是string类型的无序集合,Set中的元素。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。添加成功返回1,失败返回0。以下实例展示如何存取Set:

127.0.0.1:6379> sadd mset element1
(integer) 1
127.0.0.1:6379> sadd mset element2
(integer) 1
127.0.0.1:6379> sadd mset element3
(integer) 1
127.0.0.1:6379> sadd mset element2
(integer) 0
127.0.0.1:6379> smembers mset
1) "element3"
2) "element2"
3) "element1" 
  1. ZSet(不可重复的有序集合)

应用举例:

(1)例如存储全班同学的成绩,其集合value可以是同学的学号,而score就可以是成绩。
(2)排行榜应用,根据得分列出topN的用户等。

SortedSet的意思是他的每一个元素是有顺序的,顺序根据其score来决定,如果socre一样,则按value排序。

@Autowired
 private RedisTemplate<String, String> redisTemplate;
 
    /**
     * 设置List缓存
     * @param key     键
     * @param value   值
     * @param timeout  时长
     * @param timeUnit 缓存时间的类型(时/分/秒)
     */
	public void setZSet(String key, Set<String> valueSet, Long timeout, TimeUnit timeUnit) {
        int size = valueSet.size();
        for(String value: valueSet){
            redisTemplate.opsForZSet().add(key, value, size);
            size--;
        }
        // 在某段时间后失效
        if (timeout != null) {
            if (timeUnit != null) {
                redisTemplate.expire(key, timeout, timeUnit);
            } else {
                redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
            }
        }
    }
	/**
     * 通过key获取value缓存
     */
    public Set<String> getZSet(String key) {
        Set<String> value = null;
        if (redisTemplate.opsForZSet().size(key) != null){
            value = redisTemplate.opsForZSet().reverseRange(key, 0, redisTemplate.opsForZSet().size(key));
        }
        return value;
    }

zset的成员是唯一的,但分数(score)却可以重复。以下实例展示如何存取ZSet:

127.0.0.1:6379> zadd zset 0 element1
(integer) 1
127.0.0.1:6379> zadd zset 1 element2
(integer) 1
127.0.0.1:6379> zadd zset 5 element3
(integer) 1
127.0.0.1:6379> zadd zset 4 element4
(integer) 1
127.0.0.1:6379> zrangebyscore zset 0 5
1) "element1"
2) "element2"
3) "element4"
4) "element3"

  1. Hash(键值对集合)
    应用场景:例如存储、读取、修改用户属性(name,age,pwd等)
    应用场景:存储一些结构化的数据,比如用户的昵称、年龄、性别、积分等,存储一个用户信息对象数据。

写:

redisTemplate.opsForHash().putAll(key, value);

取:

redisTemplate.opsForHash().entries(key);
@Autowired
 private RedisTemplate<String, String> redisTemplate;
 
    /**
     * 设置缓存
     * @param key     键
     * @param value   值
     * @param timeout  时长
     * @param timeUnit 缓存时间的类型(时/分/秒)
     */
    public void set(String key, Map<String, String> value, Long timeout, TimeUnit timeUnit) {
        // 写入Map缓存,
        redisTemplate.opsForHash().putAll(key, value);
        // 设置缓存时效
		if (timeout != null) {
		    if (timeUnit != null) {
		        redisTemplate.expire(key, timeout, timeUnit);
		     } else {
		        redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
		    }
		 }
	}

    /**
     * 通过key获取value缓存
     */
    public Map<String, String> getMap(String key) {
        Map<Object, Object> value = redisTemplate.opsForHash().entries(key);
        Map<String, String> result = new HashMap<>();
        for (Map.Entry<Object, Object> entry : value.entrySet()) {
            result.put(entry.getKey().toString(), entry.getValue().toString());
        }
        return result;
    }

要把一个Hash保存到redis中,遍历Map<String,String>,逐个调用hset(key,hashKey,hashValue),获取所有值有hgetAll(key)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: Redis支持的数据类型包括字符串(String)、字典(Hash)、列表(List)、集合(Set)、有序集合(SortedSet)、HyperLogLog、Geo和Pub/Sub。其中字符串是最基本的数据类型, Hash用于存储键值对的集合, List是一个有序的字符串列表, Set是一个不重复的字符串集合, SortedSet是一个有序的、不重复的字符串集合。除了这些基本的数据类型,如果你是Redis中的高级用户,还可能接触到HyperLogLog、Geo和Pub/Sub等高级数据结构。另外,Redis也支持集群架构,可以将多台服务器构成一个整体,对外界来说,这一组服务器就像是集群一样,可以实现横向扩展和负载均衡。 对于数据的存取Redis使用不同的符号来标识不同的数据类型,比如" "表示简单字符串,"-"表示错误,":"表示整数,"$"表示字符串,"*"表示数组。 Redis的持久化机制非常重要,在面试中也会经常被问到,你可以参考相关文章来深入理解Redis的持久化机制和架构模式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [来讨论一下这些常见的 Redis 面试题](https://blog.csdn.net/weixin_36380516/article/details/105321477)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [46道Redis面试题,含参考答案!](https://blog.csdn.net/m0_72885838/article/details/126182169)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [redis面试题总结(附答案)](https://blog.csdn.net/guorui_java/article/details/117194603)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无极的移动代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值