赞
踩
Redis是一个基于内存的key-value数据库,它是[Remote Dictionary Servicel]的首字母缩写,也就是远程字典服务。
基于诶存存储,读写性能高
适合存储热点数据(热点商品、资讯、新闻)
企业应用广泛
Redis 是一个开源 (BSD 许可证)、内存中的数据结构存储,用作数据库、缓存、消息代理和流处理引擎。Redis 提供了字符串、哈希、列表、集合、有序集合、位图、HyperLogLogs、地理空间索引和流等数据结构。Redis 内置了复制、Lua 脚本、LRU 淘汰、事务、不同级别的持久化,并通过Redis Sentinel提供高可用性,并通过Redis Cluster进行自动分区。
你可以在这些类型上运行 原子操作 ,比如向字符串追加; 递增哈希中的值;向列表中推送元素; 计算集合的交集、并集和差集; 或者获取排序集中排名最高的成员。
要实现最佳性能,Redis与内存数据集配合工作。根据您的用例,Redis可以通过定期将数据集转储到磁盘或通过将每个命令附加到基于磁盘的日志来持久化数据。如果您只需要一个功能丰富的网络化内存缓存,还可以禁用持久化。
Redis支持异步复制,具有快速的非阻塞同步和在网络分裂时的自动重新连接和部分重新同步功能。
NoSql(Not Only Sql),不仅仅是sql,泛指非关系型数据库(数据库之间没有关系),并不是要取代关系型数据库,而是关系型数据库的补充。
数据库排行榜:
数据缓存
消息队列等等
redis是一种高级的key-value的存储系统,键是string类型,其中value支持五种数据类型,对于键和值的描述如下所示:
键(key):
[1] 键不能重复
[2] 作用:标识存储的数据
[3] 数据类型:String
[4] 命名规则:
1)不能太长:因为查询效率低,查询起来不方便
2)不能太短:容易重复,并且可读性差
3)按照规范:HEIMA_STU_LIST
值(value):支持五种数据类型
string 字符串类型,类似于java中string
hash 由键值对组成,类似于java中的map
list 列表类型,类似于java中的list,元素存取有序,可以重复
set 集合类型,类似于java中的set,元素存取无序,不可重复
sorted set/zset 有序的集合类型,每个元素有一个分数来决定他的顺序
字符串类型是Redis中最为基础的数据存储类型,它在Redis中以二进制保存,无论存入的是字符串、整数、浮点类型都会以字符串写入
在Redis中字符串类型的值最多可以容纳的数据长度是512M,这是以后最常用的数据类型
更多命令可以参考redis中文网
补充:
批量操作:
mset name lisi addr sh
mget name age addr
del name age
用户登录后端保存短信验证码,并设置失效时间;
代替后端session功能,实现分布式缓存(是将数据分散存储在多台独立的设备上)等
1.添加值:set 键 值
2.获取值:get 键
3.删除值:del 键
Redis中的Hash类型可以看成是键和值都是string类型的Map容器,每一个hash可以存储4G个键值对
该类型非常适合于存储对象的信息。如一个用户有姓名,密码,年龄等信息,则可以有username,password,age等键。它的存储结构如下:
命令 | 功能 |
---|---|
hset 键 字段 值 | 添加键,字段,值 |
hget 键 字段 | 通过键,字段得到值 |
hmset 键 字段 值 字段 值 | multiply多个,一次添加多个字段和值 |
hmget 键 字段 字段 | 通过键,获取多个字段和值 |
hdel 键 字段 字段 | 删除一个或多个字段的值 |
hgetall 键 | 得到这个键下所有的字段和值 |
HKEYS 键 | 获取hash表中所有字段 |
HVALS 键 | 获取hash表中所有值 |
购物车
以用户id为key,商品id为field,商品数量为value,恰好构成了购物车的三个要素,如下图所示:
功能 | hash类型的操作命令 |
---|---|
添加值 | hset |
得到值 | hget |
删除值 | hdel |
添加多个字段 | hmset |
得到多个字段值 | hmget |
得到所有的字段值 | hgetall |
在redis 中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其左部和右部添加新的元素。在插入时,如果该键并不存在,redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除,List中可以包含的最大元素数量是4G个
—微信朋友圈点赞,要求按照点赞顺序显示好友信息,如果取消点赞,移除对应好友信息
—list类型的range命令可以分页查看队列中的数据。可将每隔一段时间计算的排行榜存储在list类型中,如京东每日的手机销量排行、学校每次月考学生的成绩排名等
1.从左边添加元素:lpush
2.从右边添加元素:rpush
3.从左边删除元素:lpop
4.从右边删除元素:rpop
5.得到指定范围的元素:lrange
6.得到列表的长度:llen
在Redis中,我们可以将set类型看作为没有排序的字符集合,和LIst类型一样,我们也可以在该类型的数值上执行添加、删除或判断某一元素是否存在等操作。Set可包含的最大元素数量是4G,和List类型不同的是,Set集合中不允许出现重复的元素。
需要去重的少量信息,比如:身份证信息、手机号码等作为黑名单|白名单
共同好友查询,使用set的交集
eg:zhang:{11,22,33,44} lisi:{22,33,66,88}
zhangsan和lisi的共同好友:交集取22 33 即可
1.添加元素:sadd
2.删除元素:srem
3.得到所有元素:smembers
4判断元素是否存在:sismember
Redis有序集合(sorted set)和set集合一样也是无序不可重复。不同的是每个元素都会关联一个分数(排序因子)。
redis正是通过分数来为集合中的成员进行从小到大的排序
有序集合的成员是唯一的,但分数(score)却可以重复,每个集合可以存储40多亿个成员
b站视频点击量排名
新浪热点文章点击量、收藏量等排名
命令 | 行为 |
---|---|
zadd | 添加 |
zrange | 查询 |
zrem | 删除 |
zcard | 个数 |
zrank | 索引号 |
zscore | 得到分数 |
java程序中如何操作Redis呢?这就需要使用redis的Java客户端,就像用JDBC操作MySQL数据库一样。
Redis的java客户端很多,官方推荐的有三种:
Jedis
Lettuce
Redisson
spring对Redis客户端进行了整合,提供了SpringData Redis,在Springboot项目中还提供了对应的Starter,即spring-boot-starter-data-redis
Spring Data Redis是Spring的一部分,提供了在Spring应用中通过简单的配置就可以访问redis服务,对redis底层开发包进行了高度封装。在Spring项目中,可以使用Spring Data Redis来简化Redis操作。
Maven坐标:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.4.8</version>
</dependency>
Spring Boot提供了对应的Starter,Maven坐标
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对类似jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:
ValueOperations:简单K-V操作(String类型)
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对hash类型的数据操作
ListOperations:针对list类型的数据操作
1.创建Maven项目,配置pom.xml文件
2.编写启动类
3.配置application.yml
spring:
#redis相关配置
redis:
host: 192.168.200.128 # 链接linux系统的redis
port: 6379 #端口号
database: 0 #操作的是0号数据库
解释说明:
spring.redis.database:指定使用redis的哪个数据库,redis服务器启动后默认有16个数据库,编号分别从0-15,可以通过配置文件来指定数据库的数量
4.提供测试类
/** * @description string设置 key和 value的值 */ public void set(String key, Object value) { redisTemplate.opsForValue().set(key, value); } /** * @description string设置 key和 value的值并设置过期时间和时间单位 */ public void setWithExpire(String key, Object value, Long seconds, TimeUnit timeUnit) { redisTemplate.opsForValue().set(key, value, seconds, timeUnit); } /** * @description string获取 key对应的 value值 */ public Object get(String key) { return redisTemplate.opsForValue().get(key); } /** * @description 判断在 redis中是不是存在对应的 key值,有的话就返回 true,没有就返回 false */ public Boolean hasKey(String key) { return redisTemplate.hasKey(key); } /** * @description 删除redis中对应的key值 */ public Boolean del(String key) { return redisTemplate.delete(key); }
/** * @description 新增map值 */ public void put(String key, Object field, Object value) { redisTemplate.opsForHash().put(key, field, value); } /** * @description 以map集合的形式添加键值对 */ public void putAll(String key, Map<Object, Object> map) { redisTemplate.opsForHash().putAll(key, map); } /** * @description 获取 map中指定的 key值,如果存在则返回值,没有就返回null */ public Object getMapValue(String key, String field) { return redisTemplate.opsForHash().get(key, field); } /** * @description 根据 key获取 Map对象 */ public Map<Object, Object> getMap(String key) { return redisTemplate.opsForHash().entries(key); } /** * @description 当 hashKey不存在的时候,进行设置 map的值 */ public Boolean putIfAbsent(String key, Object hashKey, Object value) { return redisTemplate.opsForHash().putIfAbsent(key, hashKey, value); }
/** * @description 把值添加在 list */ public Long leftPush(String key, Object... values) { return redisTemplate.opsForList().leftPushAll(key, values); } /** * @description 直接把一个新的 list添加到老的 list上面去 * @return java.lang.Long */ public Long leftPushAll(String key, List<Object> value) { return redisTemplate.opsForList().leftPushAll(key, value); } /** * @description List存在的时候就加入新的值 */ public long leftPushIfPresent(String key, Object value) { return redisTemplate.opsForList().leftPushIfPresent(key, value); } /** * @description 把值添加在 list的最后面 */ public long rightPush(String key, Object value) { return redisTemplate.opsForList().rightPush(key, value); } /** * @description 根据索引获取 list中的值 */ public Object index(String key, long index) { return redisTemplate.opsForList().index(key, index); } /** * @description 获取 list中开始索引到结束索引的所有值 */ public List<Object> range(String key, long start, long end) { return redisTemplate.opsForList().range(key, start, end); }
/** * @description 添加元素到 set中 */ public Long add(String key, Collection<Object> values) { return redisTemplate.opsForSet().add(key, values); } /** * @description 从 set中删除一个随机元素,并返回该元素 */ public Object pop(String key) { return redisTemplate.opsForSet().pop(key); } /** * @description 获取 set集合的大小 */ public Long sizeSet(String key) { return redisTemplate.opsForSet().size(key); } /** * @description 判断 set集合中是否存在value值 */ public Boolean isMember(String key, Object value) { return redisTemplate.opsForSet().isMember(key, value); } /** * @description 获取两个集合的交集并返回一个集合 */ public Set<Object> intersect(String key, String otherKey) { return redisTemplate.opsForSet().intersect(key, otherKey); }
/** * @description 添加元素到 zset,从小到大排序 */ public Boolean add(String key, Object value, double score) { return redisTemplate.opsForZSet().add(key, value, score); } /** * @description 返回 zset元素在集合的从小到大排名 */ public Long rank(String key, Object object) { return redisTemplate.opsForZSet().rank(key, object); } /** * @description 返回 zset元素在集合的由大到小排名 */ public Long reverseRank(String key, Object object) { return redisTemplate.opsForZSet().reverseRank(key, object); } /** * @description 获取 zset集合中指定区间的元素 */ public Set<ZSetOperations.TypedTuple<Object>> reverseRangeWithScores(String key, long start, long end) { return redisTemplate.opsForZSet().reverseRangeWithScores(key, start, end); } /** * @description 查询 zset集合中的元素并从小到大排序 */ public Set<Object> reverseRangeByScore(String key, double min, double max) { return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max); }
关于redis连接池并没有什么效果,配置好之后会优化获取连接性能
pom引入依赖:
<!-- redis创建连接池,默认不会创建连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactid>commons-pool2</artifactid>
</dependency>
配置连接池:
#配置redis环境
spring:
#redis相关配置
redis:
host: 192.168.200.128 # 链接linux系统的redis
port: 6379 #端口号
database: 0 #操作的是0号数据库
lettcure:
pool:
max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -lms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 8 # 连接池中的最大空闲连接
min-idle: 1 # 连接池中的最小空闲连接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。