jedis

面试题:Redis 40 道

夙愿已清 提交于 2020-12-15 02:21:59
点击上方“ 码农进阶之路 ”,选择 “ 设为星标 ” 回复 “ 面经 ” 获取面试资料 1、什么是Redis? Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数据的备份,即master-slave模式的数据备份。 Redis 优势 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。 Redis与其他key-value存储有什么不同? Redis有着更为复杂的数据结构并且提供对他们的原子性操作

Redis(十七):批量操作Pipeline

拜拜、爱过 提交于 2020-12-12 15:28:43
大多数情况下,我们都会通过请求-相应机制去操作redis。只用这种模式的一般的步骤是,先获得jedis实例,然后通过jedis的get/put方法与redis交互。由于redis是单线程的,下一次请求必须等待上一次请求执行完成后才能继续执行。然而使用Pipeline模式,客户端可以一次性的发送多个命令,无需等待服务端返回。这样就大大的减少了网络往返时间,提高了系统性能。   下面用一个例子测试这两种模式在效率上的差别:    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 public class PiplineTest { private static int count = 10000 ; public static void main(String[] args){ useNormal(); usePipeline(); } public static void usePipeline(){ ShardedJedis jedis = getShardedJedis(); ShardedJedisPipeline pipeline = jedis.pipelined(); long

spring boot redis分布式锁

我是研究僧i 提交于 2020-12-12 02:36:06
一. Redis 分布式锁的实现以及存在的问题 锁是针对某个资源,保证其访问的互斥性,在实际使用当中,这个资源一般是一个字符串。使用 Redis 实现锁,主要是将资源放到 Redis 当中,利用其原子性,当其他线程访问时,如果 Redis 中已经存在这个资源,就不允许之后的一些操作。spring boot使用 Redis 的操作主要是通过 RedisTemplate 来实现,一般步骤如下: 将锁资源放入 Redis (注意是当key不存在时才能放成功,所以使用 setIfAbsent 方法): redisTemplate.opsForValue().setIfAbsent("key", "value"); 设置过期时间 redisTemplate.expire("key", 30000, TimeUnit.MILLISECONDS); 释放锁 redisTemplate.delete("key"); 一般情况下,这样的实现就能够满足锁的需求了,但是如果在调用 setIfAbsent 方法之后线程挂掉了,即没有给锁定的资源设置过期时间,默认是永不过期,那么这个锁就会一直存在。所以需要保证设置锁及其过期时间两个操作的原子性,spring data的 RedisTemplate 当中并没有这样的方法。但是在jedis当中是有这种原子操作的方法的,需要通过 RedisTemplate 的

Redis的浅入门

孤者浪人 提交于 2020-12-08 07:48:46
<center><font size=8>Redis的浅入门</font></center> # 缓存的思想 问题提出:我们的用户数量上亿,如果登录,访问数据库user特别耗时,该怎么办?——提出缓存 方法:怎样从缓存在获取数据? *有数据: 直接返回 *无数据: (1)从数据库查询 (2)将数据放入缓存 (3)返回数据 认识redis 特点:-属于NOSQL,数据之间没有关联关系,数据存储在内存。 对比一下关系型数据库(MYSQL..)数据之间有关联,数据存储在硬盘的文件上。 数据结构-[key,value] key - 字符串 value - 5种不同 value数据结构: 字符串类型 String 哈希类型 hash 列表类型 list 集合类型 set 有序集合类型 sortedset 五种数据结构命令 https://www.redis.net.cn/ 可以看一个学习redis的中文网 1. 字符串类型 string 1. 存储: set key value 2. 获取: get key 3. 删除: del key 2. 哈希类型 hash 1. 存储: hset key field value 2. 获取: * hget key field: 获取指定的field对应的值 * hgetall key:获取所有的field和value 3. 删除: hdel key

【Redis】使用jedis管理redis

拜拜、爱过 提交于 2020-12-08 01:53:18
前言 之前的博客中,redis已经安装成功了,单纯的在命令行输入命令来操作数据库是远远不能满足我们的需求的,我们需要使用java代码来操作redis,于是我们引入了jedis。 添加jar包 <!-- Redis客户端 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> 单机版 每次使用都创建一个jedis连接 public void jedis() throws Exception{ //创建一个连接jedis对象,参数:host;port Jedis jedis = new Jedis("单机版redis的ip地址", 端口号); //直接使用jedis操作redis,所有jedis命令都对应一个方法 jedis.set("test", "sds"); String string = jedis.get("test"); System.out.println(string); //关闭连接 jedis.close(); } 使用连接池 public void jedisPool() throws Exception{ //创建一个连接池,两个参数:host和port JedisPool jedisPool = new JedisPool(

Redis学习笔记(4)—— Jedis入门

拈花ヽ惹草 提交于 2020-12-06 18:16:33
一、Jedis介绍   Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如Java、C、C#、C++、php、Node、js、Go等。   在官方网站里列的一些Java客户端,有jedis、Redisson、Jredis等,其中官方推荐使用jedis,在企业中用的最多的就是Jedis。 二、Java连接Redis 2.1 导入jar包 commons-pool2-2.3.jar jedis-2.7.0.jar 2.2 单实例连接 @Test public void testJedisSingle() throws Exception { // 1.设置ip地址和端口号 Jedis jedis = new Jedis("192.168.25.129", 6379 ); // 2.设置数据 jedis.set("name", "zhangsan" ); // 3.获得数据 String name = jedis.get("name" ); System.out.println(name); // 4.释放资源 jedis.close(); }    注: 如果执行上面代码时抛出如下异常 redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeOutException:

妈妈再也不用担心我不会Redis了!

痴心易碎 提交于 2020-12-04 11:29:19
前言: Redis 是如今互联网技术架构中,使用最广泛的缓存。支持 复杂的数据结构 ,支持 持久化 ,支持 主从集群 ,支持 高可用 ,支持 较大的value存储 ... 同时, Redis 也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一。特别是那些优秀的、竞争激烈的大型互联网公司(比如 Twitter、新浪微博、阿里云、腾讯云、淘宝、知乎等),通常要求面试者不仅仅掌握 Redis 基础使用,更要求深层理解 Redis 内部实现的细节原理。毫不夸张地说,能把 Redis 的知识点全部吃透,你的半只脚就已经踏进心仪大公司的技术研发部。 然而,绝大部分开发者只会拿 Redis 做数据缓存,使用最简单的 get/set 方法,除此之外几乎一片茫然,对 Redis 内部实现的细节原理知之甚少。例如: 有同学知道 Redis 的 分布式锁 ,但完全不清楚其内部实现机制 有同学知道 Redis 是 单线程结构 ,但完全不理解 Redis 缘何单线程还可以支持高并发 有同学知道 Redis 支持 主从 ,但完全不晓得内部的实现机制 于是,一位有着十年经验的互联网分布式高并发技术老兵,梳理自己多年 Redis 实践经验,写了这本书,以帮助更多工程师更快,更深入的了解 Redis 。 作者在掌阅维护着上千个 Redis 实例的集群,他在 Redis 持久化,缓存,消息队列 的各类实战经验

Redis基础用法、高级特性与性能调优以及缓存穿透等分析

时光怂恿深爱的人放手 提交于 2020-12-02 10:25:00
目录 一、Redis介绍 二、Redis数据结构及常用的命令 三、Redis持久化策略选择 四、内存管理与数据淘汰机制 五、Redis过期策略及实现原理 1 说明 2 设置过期时间 3 三种过期策略 4 Redis采用的过期策略 六 Redis事务实现 七 Redis分布式锁实现 八 缓存穿透、缓存击穿、缓存雪崩、热点数据失效 1、缓存穿透 2、缓存击穿 3、缓存雪崩 4、解决热点数据集中失效问题 九 Redis如何快速删除1.2亿+指定前缀的key 1 事故产生原因 2 原因分析 3 解决方案 4 如何执行删除 参考: 回到顶部 一、Redis介绍   Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库、缓存服务或消息服务使用。Redis支持多种数据结构,包括字符串、哈希表、链表、集合、有序集合、位图、Hyperloglogs等。Redis具备LRU淘汰、事务实现、以及不同级别的硬盘持久化等能力,并且支持副本集和通过Redis Sentinel(哨兵)实现的高可用方案,同时还支持通过Redis Cluster(集群)实现的数据自动分片能力。   Redis的主要功能都基于单线程模型实现,也就是说Redis使用一个线程来服务所有的客户端请求,同时Redis采用了非阻塞式IO,并精细地优化各种命令的算法时间复杂度,这些信息意味着: Redis是线程安全的

SpringBoot Redis 订阅发布

馋奶兔 提交于 2020-12-01 01:58:07
一 配置application.yml spring: redis: jedis: pool: max -active: 10 min -idle: 5 max -idle: 10 max -wait: 2000 port: 6379 host: 192.168.1.88 timeout: 1000 二 实现监听 package com.example.demo.common; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; import org.springframework.stereotype.Component; /** * @author Tyler * @date 2019/7/11 */ @Component public class RedisMessageListener implements MessageListener { @Override public void onMessage(Message message, byte [] bytes) { String body = new String(message.getBody()); String

补习系列(13)-springboot redis 与发布订阅

雨燕双飞 提交于 2020-12-01 01:48:14
一、订阅发布 订阅发布 是一种常见的设计模式,常见于消息系统的场景。 如下面的图: [来自百科] 消息发布者是消息载体的生产者,其通过某些主题来向 调度中心 发送消息; 而消息订阅者会事先向 调度中心 订阅其 "感兴趣" 的主题,随后会获得新消息。 在这里, 调度中心 是一个负责消息控制中转的逻辑实体,可以是消息队列如ActiveMQ,也可以是Web服务等等。 常见应用 微博,每个用户的粉丝都是该用户的订阅者,当用户发完微博,所有粉丝都将收到他的动态; 新闻,资讯站点通常有多个频道,每个频道就是一个主题,用户可以通过主题来做订阅(如RSS),这样当新闻发布时,订阅者可以获得更新。 二、Redis 与订阅发布 Redis 支持 (pub/sub) 的订阅发布能力,客户端可以通过channel(频道)来实现消息的发布及接收。 1. 客户端通过 SUBSCRIBE 命令订阅 channel 2. 客户端通过PUBLISH 命令向channel 发送消息; 而后,订阅 channel的客户端可实时收到消息。 除了简单的SUBSCRIBE/PUBLISH命令之外,Redis还支持订阅某一个模式的主题(正则表达式), 如下: PSUBSCRIBE / topic / cars /* 于是,我们可以利用这点实现相对复杂的订阅能力,比如: 在电商平台中订阅多个品类的商品促销信息; 智能家居场景