没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
引言 在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而随着互联网技术的进一步发展,各种类型的应用层出不穷,这导致在当今云计算、大数据盛行的时代,对性能有了更多的需求,主要体现在以下四个方面: 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理 庞大运营成本的考量:IT部门希望在硬件成本、软件成本和人力成本能够有大幅度地降低 为了克服这一问题,NoSQL应运而生,它同时具备了高性能、可扩展性强、高可用等优点,受到广泛开发人员和仓库管理人员的青睐。 Redis是什么 Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数
资源推荐
资源详情
资源评论
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/release/download_crawler_static/89645647/bg1.jpg)
Redis 是什么
� 面试官:你先来说下 redis 是什么吧
� 我:(这不就是总结下 redis 的定义和特点嘛)Redis 是 C 语言开发的一个开源的(遵
从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、
消息中间件等。它是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库。
� 我顿了一下,接着说:Redis 作为一个内存数据库。1、性能优秀,数据在内存中,
读写速度非常快,支持并发 10W QPS;2、单进程单线程,是线程安全的,采用 IO
多路复用机制;3、丰富的数据类型,支持字符串(strings)、散列(hashes)、列表
(lists)、集合(sets)、有序集合(sorted sets)等;4、支持数据持久化。可以将内
存中数据保存在磁盘中,重启时加载;5、主从复制,哨兵,高可用;6、可以用作
分布式锁;7、可以作为消息中间件使用,支持发布订阅
五种数据类型
� 面试官:总结的不错,看来是早有准备啊。刚来听你提到 redis 支持五种数据类型,
那你能简单说下这五种数据类型吗?
� 我:当然可以,但是在说之前,我觉得有必要先来了解下 Redis 内部内存管理是如
何描述这 5 种数据类型的。说着,我拿着笔给面试官画了一张图:
我:首先 redis 内部使用一个 redisObject 对象来表示所有的 key 和 value,redisObject 最主要
的信息如上图所示:type 表示一个 value 对象具体是何种数据类型,encoding 是不同数据类
型在 redis 内部的存储方式。比如:type=string 表示 value 存储的是一个普通字符串,那么
encoding 可以是 raw 或者 int。
我顿了一下,接着说:下面我简单说下 5 种数据类型:
1、string 是 redis 最基本的类型,可以理解成与 memcached 一模一样的类型,一个 key 对应
一个 value。value 不仅是 string,也可以是数字。string 类型是二进制安全的,意思是 redis
的 string 类型可以包含任何数据,比如 jpg 图片或者序列化的对象。string 类型的值最大能
存储 512M。
2、Hash 是一个键值(key-value)的集合。redis 的 hash 是一个 string 的 key 和 value 的映射
表,Hash 特别适合存储对象。常用命令:hget,hset,hgetall 等。
3、list 列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左
边)或者尾部(右边) 常用命令:lpush、rpush、lpop、rpop、lrange(获取列表片段)等。应
用场景:list 应用场景非常多,也是 Redis 最重要的数据结构之一,比如 twitter 的关注列表,
粉丝列表都可以用 list 结构来实现。数据结构:list 就是链表,可以用来当消息队列用。redis
提供了 List 的 push 和 pop 操作,还提供了操作某一段的 api,可以直接查询或者删除某一段
的元素。实现方式:redis list 的是实现是一个双向链表,既可以支持反向查找和遍历,更方
便操作,不过带来了额外的内存开销。
4、set 是 string 类型的无序集合。集合是通过 hashtable 实现的。set 中的元素是没有顺序的,
而且是没有重复的。常用命令:sdd、spop、smembers、sunion 等。应用场景:redis set 对
外提供的功能和 list 一样是一个列表,特殊之处在于 set 是自动去重的,而且 set 提供了判
断某个成员是否在一个 set 集合中。
5、zset 和 set 一样是 string 类型元素的集合,且不允许重复的元素。常用命令:zadd、
zrange、zrem、zcard 等。使用场景:sorted set 可以通过用户额外提供一个优先级(score)
的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的
集合列表,那么可以选择 sorted set 结构。和 set 相比,sorted set 关联了一个 double 类型权
重的参数 score,使得集合中的元素能够按照 score 进行有序排列,redis 正是通过分数来为
![](https://csdnimg.cn/release/download_crawler_static/89645647/bg2.jpg)
集合中的成员进行从小到大的排序。实现方式:Redis sorted set 的内部使用 HashMap 和跳
跃表(skipList)来保证数据的存储和有序,HashMap 里放的是成员到 score 的映射,而跳跃表
里存放的是所有的成员,排序依据是 HashMap 里存的 score,使用跳跃表的结构可以获得比
较高的查找效率,并且在实现上比较简单。
我:我之前总结了一张图,关于数据类型的应用场景,如果您感兴趣,可以去我的掘金看。。
数据类型应用场景总结
� 面试官:想不到你平时也下了不少工夫,那 redis 缓存你一定用过的吧
� 我:用过的。。
� 面试官:那你跟我说下你是怎么用的?
� 我是结合 spring boot 使用的。一般有两种方式,一种是直接通过 RedisTemplate 来
使用,另一种是使用 spring cache 集成 Redis(也就是注解的方式)。具体的代码我就
不说了,在我的掘金中有一个 demo(见下)。
Redis 缓存
� 直接通过 RedisTemplate 来使用
� 使用 spring cache 集成 Redis pom.xml 中加入以下依赖:
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
![](https://csdnimg.cn/release/download_crawler_static/89645647/bg3.jpg)
</dependencies>
� spring-boot-starter-data-redis:在 spring boot 2.x 以后底层不再使用 Jedis,而是换成了
Lettuce。
� commons-pool2:用作 redis 连接池,如不引入启动会报错
� spring-session-data-redis : spring session 引 入 , 用 作 共 享 session 。 配 置 文 件
application.yml 的配置:
server:
port: 8082
servlet:
session:
timeout: 30ms
spring:
cache:
type: redis
redis:
host: 127.0.0.1
port: 6379
password:
# redis 默认情况下有 16 个分片,这里配置具体使用的分片,默认为 0
database: 0
lettuce:
pool:
# 连接池最大连接数(使用负数表示没有限制),默认 8
max-active: 100
创建实体类 User.java
public class User implements Serializable{
private static final long serialVersionUID = 662692455422902539L;
private Integer id;
private String name;
private Integer age;
public User() {
}
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
![](https://csdnimg.cn/release/download_crawler_static/89645647/bg4.jpg)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
RedisTemplate 的使用方式
默认情况下的模板只能支持 RedisTemplate<String, String>,也就是只能存入字符串,所以自
定义模板很有必要。添加配置类 RedisCacheConfig.java
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisCacheConfig {
@Bean
public RedisTemplate<String, Serializable> redisCacheTemplate(LettuceConnectionFactory
connectionFactory) {
![](https://csdnimg.cn/release/download_crawler_static/89645647/bg5.jpg)
RedisTemplate<String, Serializable> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setConnectionFactory(connectionFactory);
return template;
}
}
测试类
@RestController
@RequestMapping("/user")
public class UserController {
public static Logger logger = LogManager.getLogger(UserController.class);
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private RedisTemplate<String, Serializable> redisCacheTemplate;
@RequestMapping("/test")
public void test() {
redisCacheTemplate.opsForValue().set("userkey", new User(1, "张三", 25));
User user = (User) redisCacheTemplate.opsForValue().get("userkey");
logger.info("当前获取对象:{}", user.toString());
}
然后在浏览器访问,观察后台日志 http://localhost:8082/user/test
使用 spring cache 集成 redis
spring cache 具备很好的灵活性,不仅能够使用 SPEL(spring expression language)来定义缓存的
key 和各种 condition,还提供了开箱即用的缓存临时存储方案,也支持和主流的专业缓存如
EhCache、Redis、Guava 的集成。定义接口 UserService.java
public interface UserService {
User save(User user);
void delete(int id);
User get(Integer id);
}
剩余20页未读,继续阅读
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/1028663429824ddfa6a412bb0f0846d2_qq_52590045.jpg!1)
微信公众号:数模0error
- 粉丝: 6538
- 资源: 319
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)