0%

暑期培训-Redis

NoSQL概述

1、什么是 NoSQL

NoSQL泛指非关系型的数据库Not Only SQL。

2、NoSQL 数据库的四大分类

  • 键值(key-value)存储
  • 列存储
  • 文档数据库
  • 图形数据库
分类 相关产品 典型应用 数据模型 优点 缺点
键值(key-value) Tokyo、 Cabinet/Tyrant、Redis、Voldemort、Berkeley DB、Memcached 内容缓存,主要用于处理大量数据的高访问负载 一系列键值对 快速查询 存储的数据缺少结构化
列存储数据库 Cassandra, HBase, Riak 分布式的文件系统 以列簇式存储,将同一列数据存在一起 查找速度快,可扩展性强,更容易进行分布式扩展 功能相对局限
文档数据库 CouchDB, MongoDB Web应用(与Key-Value类似,value是结构化的) 一系列键值对 数据结构要求不严格 查询性能不高,而且缺乏统一的查询语法
图形(Graph)数据库 Neo4J, InfoGrid, Infinite Graph 社交网络,推荐系统等。专注于构建关系图谱 图结构 利用图结构相关算法 需要对整个图做计算才能得出结果,不容易做分布式集群方案

MongoDB主要用来解决海量数据的访问效率问题,他是最像关系型数据库的非关系型数据库。

MongoDB 的主要适用场景为:数据不是特别重要(例如通知,推送这些),数据表结构变化较为频繁,数据量特别大,数据的并发性特别高,数据结构比较特别(例如地图的位置坐标),这些情况下用 MongoDB

Memcached主要是用来提高访问关系型数据库的效率问题,只局限于访问。

redis在我看来算是Memcached的升级版,加入了提高数据库写入的功能。

3、NoSQL 的特点

  • 易扩展

  • 灵活的数据模型

  • 大数据量,高性能

  • 高可用

4、为什么需要 NoSQL

随着web2.0互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其
是超大规模的高并发的社区! 暴露出来很多难以克服的问题,NoSQL在当今大数据环境下发展的十分迅
速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术!
很多的数据类型用户的个人信息,社交网络,地理位置。这些数据类型的存储不需要一个固定的格式!
不需要多月的操作就可以横向扩展的 ! Map<String,Object> 使用键值对来控制!

Redis简介

image-20200726194039683

  • Redis(Remote Dictionary Server ),即远程字典服务

  • 使用C语言编写的开源NoSQL数据库

  • 高性能Key-Value内存数据库

  • 支持将内存数据持久化到磁盘和即master-slave模式的数据备份(RDB和AOF)

5、大基本数据类型

  • string(字符串)最基本的数据类型一个redis中字符串value最多可以是512M nx set if not exists

  • hash(Hash表)

  • list(列表)

  • set(无序集合)

  • zset(sorted set) (有序集合)

    下面来对这5种数据结构类型作简单的介绍:

结构类型 结构存储的值 结构的读写能力
String 可以是字符串、整数或者浮点数 对整个字符串或者字符串的其中一部分执行操作;对象和浮点数执行自增(increment)或者自减(decrement)
List 一个链表,链表上的每个节点都包含了一个字符串 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值来查找或者移除元素
Set 包含字符串的无序收集器(unorderedcollection),并且被包含的每个字符串都是独一无二的、各不相同 添加、获取、移除单个元素;检查一个元素是否存在于某个集合中;计算交集、并集、差集;从集合里卖弄随机获取元素
Hash 包含键值对的无序散列表 添加、获取、移除单个键值对;获取所有键值对
Zset 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素

3种特殊数据类型

  • Geospatial 地理位置

    推算地理位置的信息,两地之间的距离,方圆几里的人

  • Hyperloglog

    使用基数估计统计网站访客数

  • Bitmap

    统计用户信息,活跃,不活跃! 登录 、 未登录!签到打卡 两个状态的,都可以使用

常用命令

  • set / get / del /getset

  • expire

    ​ Redis对于过期键有三种清除策略:

    • 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key

    • 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key

    • 当前已用内存超过maxmemory限定时,触发主动清理策略

      maxmemory 当前已用内存超过maxmemory限定时,触发主动清理策略

      • volatile-lru:只对设置了过期时间的key进行LRU(默认值)
      • allkeys-lru : 删除lru算法的key
      • volatile-random:随机删除即将过期key
      • allkeys-random:随机删除
      • volatile-ttl : 删除即将过期的
      • noeviction : 永不过期,返回错误
  • exists

  • incr

  • setrange

应用场景

  • 缓存
  • 限时业务的运用
  • 计数器相关问题(网站访问统计)
  • 排行榜相关问题
  • 任务队列
  • 分布式集群架构中的 session 分离

SpringBoot整合

依赖

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## Redis 配置
## Redis数据库索引(默认为0)
spring.redis.database=0

## Redis服务器地址
spring.redis.host=127.0.0.1

## Redis服务器连接端口
spring.redis.port=6379

## Redis服务器连接密码(默认为空)
spring.redis.password=

## 连接超时时间(毫秒)
spring.redis.timeout=5000

数据持久化

下面给出一些常用的时间格式

“”0 30 1 ? * * “每天凌晨1:30执行

“0 0 12 * * ?” 每天中午十二点触发

“0 15 10 ? * *” 每天早上10:15触发

“0 15 10 * * ?” 每天早上10:15触发

“0 15 10 * * ? *” 每天早上10:15触发

“0 15 10 * * ? 2005” 2005年的每天早上10:15触发

“0 * 14 * * ?” 每天从下午2点开始到2点59分每分钟一次触发

“0 0/5 14 * * ?” 每天从下午2点开始到2:55分结束每5分钟一次触发

“0 0/5 14,18 * * ?” 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发

“0 0-5 14 * * ?” 每天14:00至14:05每分钟一次触发

“0 10,44 14 ? 3 WED” 三月的每周三的14:10和14:44触发

“0 15 10 ? * MON-FRI” 每个周一、周二、周三、周四、周五的10:15触发

Session共享配置

1
2
3
4
5
<!--session-redis-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>

Session存储设置

1
2
配置
spring.session.store-type=redis

附录

Redis操作复杂数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.ctgu.demo;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;

import java.util.HashMap;
import java.util.Map;

@SpringBootTest
@Slf4j
class DemoApplicationTests {
@Autowired
RedisTemplate redisTemplate;

@Test
void contextLoads() {
}

@Test
@DisplayName("RediscaozSet")
void testSet(){
SetOperations operations=redisTemplate.opsForSet();
operations.add("s1", "v1");
operations.add("s1","v2");
Cursor<String>cursor=operations.scan("s1", ScanOptions.NONE);
while (cursor.hasNext()){
System.out.println(cursor.next());
}
}
@Test
@DisplayName("测试Hash")
void testHash(){
HashOperations<String,String,String> operations=redisTemplate.opsForHash();
HashMap map=new HashMap();
map.put("t1","tv1");
operations.putAll("h1",map);
operations.put("h1","k1","v1");
operations.put("h1","k2","v2");
operations.put("h1","k3","m2");
Cursor<Map.Entry<String, String>> cursor=operations.scan("h1", new ScanOptions.ScanOptionsBuilder().match("*k*").build());
while (cursor.hasNext()){
Map.Entry<String,String> entry = cursor.next();
System.out.println(entry.getKey());;
}
// System.out.println(redisTemplate.opsForHash().entries("h1"));
}

}

项目代码:

GitHub:https://github.com/iboytech/2020-7-29-redis

关于Redis的参考

👉 Redis命令手册 https://www.redis.net.cn/order/

👉 Redis练习平台 https://try.redis.io/

👉 菜鸟教程 https://www.runoob.com/redis/redis-keys.html

👉 SpringBoot整合Redis https://segmentfault.com/a/1190000017057950

iBoy wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!