这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战
定义
- Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区 [此段定义载自官网]
redis一般的使用场景
1、缓存:根据需求使用不同的缓存数据类型,降低数据库的压力
2、排行榜:有序集合ZSET可以实现各种类型的排行榜。几乎所有排行榜都是通过有序集合实现
3、计数器:通过Redis对字符串的数字操作可实现(redis的递增方法increment()来实现计数器功能)
4、社交网络:点赞、关注、被关注等功能(点赞等属于高频操作 若每次操作都和数据库打交道 会影响数据库的性能)
5、分布式锁:redisTemplate.opsForValue().setIfAbsent(key, value)可实现分布式锁
6、消息队列:实现消息队列的方式有多种,例如订阅/发布模式
6种数据类型存储(列举一些常用的表达式)
1、字符串(String)可以保存字符串、整数或浮点数 写入:redisTemplate.opsForValue().set(key, value) (get(key)读取)
替换:redisTemplate.opsForValue().getAndSet(key, value) 覆盖并返回旧值
删除:redisTemplate.delete(key) 通用删除。返回bool
2、链表 (redis是双向无环链表)链表和数组:数组的存储是相邻存储,因此查询是很快的,而链表查询比较慢,要查询a位置数据必须查到倒a-1的位置 但是链表的插入比较快,只需要移动指针,而数组查询较慢,需要将该位置的后面数据向后移动位置
3.集合 Redis中的集合是一个哈希表结构,集合内部的数据无序,不可重复,且每一个元素都是String类型
添加: redisTemplate.opsForSet().add(key, values) 返回添加成功的数量
差集:redisTemplate.opsForSet().difference(key, key2)
并集:redisTemplate.opsForSet().union(key, otherKey)
所有元素: redisTemplate.opsForSet().members(key) 返回集合所有元素
4.有序集合和集合类似,只是说它是有序的,和无序集合的主要区别在于每一个元素除了值之外,它还会多一个分数。分数是一个浮点数,在 Java 中是使用双精度表示的,根据分数,Redis 就可以支持对分数从小到大或者从大到小的排序。每一个元素都是唯一的,但是对于不同元素而言,它的分数可以一样
添加: redisTemplate.opsForZSet().add(key, value, score) 返回添加成功的数量
删除: redisTemplate.opsForZSet().remove(key, values) 返回差集
排序: redisTemplate.opsForZSet().rank(key, value)
区间排序: redisTemplate.opsForZSet().range(key, start, end) 区间排序集合
5.哈希 一个键可以保存多个键值对 其实哈希底层就是采用散列算法 哈希表是由数组表和链表组合 当计算得key一样 则将值用链表存起来如下图
添加: redisTemplate.opsForHash().put(key, hashKey, value)
删除: redisTemplate.opsForHash().delete(key, hashKeys)
获取: redisTemplate.opsForHash().get(key, hashKey) 获取指定 key下的hashkey
验证: redisTemplate.opsForHash().hasKey(key, hashKey) 验证key是否有hashKey
还有一种是基数 想了解 可以自行了解
总结
今天主要是分享了一些redis得基础知识 首先要知道redis到底是什么,为什么要用它(应用场景),在这样得背景下去了解它是如何去存储数据 。redis的内容很多 例如还有它的分布式锁等 以后会慢慢分享