Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >rodert单排学习redis进阶【白银一】

rodert单排学习redis进阶【白银一】

原创
作者头像
JavaPub
修改于 2020-06-28 02:25:20
修改于 2020-06-28 02:25:20
3481
举报
文章被收录于专栏:JavaPubJavaPub

redis之白银一

说些题外话,最近帝都疫情又严重,大家都身处时代洪流中,这不是个别人能左右的,希望你能保护好自己,天天开心。

toc

前言

声明:参考来源互联网,有任何争议可以留言。站在前人的肩上,我们才能看的更远。

前文推荐阅读:

rodert单排学习redis入门【黑铁】

rodert 单排学习 redis 进阶【青铜】

1.Redis 客户端

1.1.Redis Desktop Manager

使用称手的工具,做起事来 事半功倍 ,用 redis-cli 自然不错。我推荐一款我经常用的 Redis 可视化工具,Redis Desktop Manager

启动界面如下:

至于安装方式是 一键安装

官网下载地址:https://redisdesktop.com/pricing

学生和学习者可以公众号后台回复:【666】,免费获取。

2.Redis 连接池

2.2.0.连接池

池技术被广泛使用在系统开发中,像 JDBC 连接池、线程池等。连连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。

在处理一个任务时,我们大多情况要在数毫秒级别就完成,如果重复创建、关闭资源,会占用较长时间和大量系统资源。

  • 使用连接池优势
  1. 减少连接创建时间

连接在系统初始化时就创建完成,需要时直接从池中取用,减少了时间开销。

  1. 简化的编程模式

当使用连接池时,每一个单独的线程能够像创建了一个自己的 JDBC 连接一样操作。

  1. 受控的资源使用

连接池能够控制一个模块的资源占用率,不会让一个模块资源占用过高,导致整个系统崩溃。

2.1.Redis 连接池

2.1.1.前言引入

Redis 修炼之连接池篇,前面讲了Redis入门篇:rodert单排学习redis入门【黑铁】rodert 单排学习 redis 进阶【青铜】,对 Redis 基本数据类型的操作做了讲解。

在以前没有开源连接池时,很多人自写连接池工具,简单来说就是创建一个集合,存放一批连接,动态维护着。保证每个连接都是有效的。

2.1.2.Redis 连接池

本教程涉及到的一些代码都是 Java 语言编写。

maven 依赖,引入 pom.xml 文件

  • pom.xml
代码语言:txt
AI代码解释
复制
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.3.0</version>
</dependency>
  • RedisUtil.java
代码语言:txt
AI代码解释
复制
public final class RedisUtil {
    //IP 地址
    private static String ADDR = "127.0.0.1";
    //端口号
    private static int PORT = 6379;
    //redis 服务端密码
    private static String PWD = "123456";
    
    //可用连接实例最大数目,默认为 8,若赋值 -1,表示不被限制
    private static Integer MAX_TOTAL = 1024;
    //控制一个连接池最多有多少个状态为空闲的 jedis 实例,默认值为 8
    private static Integer MAX_IDLE = 200;
    
    //等待可用连接最大的等待时间,单位 ms,默认值 -1,表示永不超时,若等待超时抛出 JedisConnectionException
    private static Integer MAX_WAIT_MILLIS = 10000;
    //超时
    private static Integer TIMEOUT = 10000;
    
    //在用一个 jedis 实例时,是否提前进行 validate 操作,若结果为 true 则 jedis 实例可用
    private static Boolean TEST_ON_BORROW = true;
    
    //jedis 连接池
    private static JedisPool jedisPool = null;
    
    /**
     * 初始化 jedis 连接池的静态块,RedisPool 第一次类加载时执行,以后便不再执行
     */
    static {
        try {
            JedisPoolConfig conf = new JedisPoolConfig();
            /*
             * 高版本 jedis jar 中 JedisPoolConfig 没有 setMaxActive 和 setMaxWait 属性,因为官方在高版本			   * 中启用了此方法,用以下两个属性替换
             * maxActive ==> maxTotal
             * maxWait ==> maxWaitMillis
             */
            //设置连接实例最大数目
            conf.setMaxTotal(MAX_TOTAL);
            //设置最多多少空闲的 jedis 实例
            conf.setMaxIdle(MAX_IDLE);
            //设置等待可用连接的最大时间
            conf.setMaxWaitMillis(MAX_WAIT_MILLIS);
            //设置是否提前进行测试借用
            conf.setTestOnBorrow(TEST_ON_BORROW);
            
            //新建 jedis 连接池
            jedisPool = new JedisPool(conf, ADDR, PORT, TIMEOUT, PWD);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /*
     * 获取 jedis 实例来操作数据,每次使用完要将连接返回给连接池 jedis.close()
     * @return
     */
    public synchronized static Jedis getRedis() {
        try {
            if(jedisPool != null) {
                //获取 jedis 实例
                Jedis jedis = jedisPool.getResource();
                return jedis;
            }
            else{
                System.out.println("没有找到 Jedis 连接池!");
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /*
     * 用来回收 Jedis 对象资源,用户需要用到此方法释放资源,否则一直占用资源,在新版本中,`returnResource(jedis) 将被废弃不推荐使用,`直接调用 `jedis.close();` 归还连接到连接池。
     * @param Jedis jedis
     */
    public synchronized static void returnJedis(Jedis jedis) {
        try {
            if(jedis != null) {
                //回收 jedis 对象资源
                jedisPool.returnResource(jedis);
                System.out.println("Jedis 被成功回收!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

-

本教程纯手打,致力于最实用教程,不需要什么奖励,只希望多多转发支持。 欢迎来我公众号,希望可以结识你,也可以催更,微信搜索:JavaPub

有任何问题都可以来谈谈 !

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
希望可以给我点个赞!更多的干货资料,可以在GitHub上查看:https://github.com/Rodert/JavaPub
希望可以给我点个赞!更多的干货资料,可以在GitHub上查看:https://github.com/Rodert/JavaPub
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
【Redis】Java中使用Jedis操作Redis(Maven导入包)、创建Redis连接池
如果我们使用Java操作Redis, 需要确保已经安装了 redis 服务及 Java redis 驱动。
谙忆
2021/01/21
1.1K0
jedispool是什么_netpoll
遇到的问题: 一开始做项目一直用的是jedis对象连接,今天发现自己上线的项目抛出了异常:JedisConnectionException: java.Net.SocketTimeoutException: Read timed和和java.lang.ClassCastException: [B cannot be cast to java.util.List。 异常解释: jedis的默认读取时间是2s,由于我用的是jedis对象连接因此当多个线程操作redis的时候,redis服务器采用的机制是FIFO(先入先出)机制,因此会使得线程等待时间增长,因此会造成redis读取超时,看了这个文章(https://blog.csdn.net/shuaiOKshuai/article/details/23266091)后,所以我在创建jedis对象时候把时间改成了100s,之后没有再抛出TimedoutException不过还是抛出了ClassCastException异常,后来查询网上资料(https://hellojimmy.iteye.com/blog/1197543)发现还是因为redis读取超时导致返回值是一个特别长的序列导致和我想接收的数据类型不一致导致抛出了该异常。 解决办法: 后来还是想到只能用jedisPool连接池来管理jedis对象。 使用jedisPool的好处:
全栈程序员站长
2022/10/04
2120
redis的使用
redis具体使用 1.key的操作 除了空格、换行符 \n外,其他的字符基本都可以使用 2.Redis keys 命令 下表给出了与 Redis 键相关的基本命令: 序号 命令及描述 1 DEL key 该命令用于在 key 存在时删除 key。 2 DUMP key 序列化给定 key ,并返回被序列化的值。 3 EXISTS key 检查给定 key 是否存在。 4 EXPIRE key seconds 为给定 key 设置过期时间。 5 EXPIREAT key timestamp EX
微醺
2019/01/17
8260
redis实战第五篇 jedis 连接 redis sentinel详解
jedis针对redis sentinel给出了一个JedisSentinelPool,jedis给出了很多的构造方法,其中比较全的是下面这个,注意:这个连接池争对的连接还是主节点:
我是李超人
2020/08/20
3.2K0
redis实战第十三篇 jedis连接redis cluster
redis cluster客户端有两种; Dummy:又称为傀儡客户端,redis的重定向机制会返回当前键所在的槽和对应的节点,dummy客户端根据这一机制随机连接任一redis获取键所在的节点,这种客户端实现代码简单,每次只需要根据重定向的信息再次发送请求即可,但是这样弊端也和明显,根据重定向再次发送请求额外增加了开销。 smart:它会在内部维护一个slot→node的映射关系,本地就可以实现键到节点的查找,从而保证IO效率的莪最大化。 jedisCluster就是一种smart客户端,它的构造方法如下:
我是李超人
2020/08/20
6.9K0
java对redis的操作
需要两个包的支持 jedis-2.1.0.jar commons-pool-1.5.4.jar 一个连接池一个工具类 pool代码 1 public class RedisUtil { 2 3 private static String ADDR = "127.0.0.1"; 4 5 private static int PORT = 6379; 6 7 private static String AUTH = "123456789";
ydymz
2018/09/10
5260
Java 中使用Redis 简单操作
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
zeekling
2022/08/26
2970
redis入门篇
UserInfo getUserInfo (long id) {} 取: userRedisKey = "user:info:" + id; value = redis.get(userRedisKey ); if (value != null) { userInfo = deserialize(value); return userInfo; } 存: userInfo = ***getUserInfo(id); redis.setex(userRedisKey, 3600, serialize(userInfo)); 用string存储序列化后的数据,不够立体直观,可以转为hmset存储为哈希结构,存取更直观
张哥编程
2024/12/17
1200
redis入门篇
《快学BigData》--Redis 总结(E)(30)
redis-benchmark Redis性能测试工具
小徐
2023/03/06
2150
《快学BigData》--Redis 总结(E)(30)
ssm整合Redis
这次谈谈Redis,关于Redis应该很多朋友就算没有用过也听过,算是这几年最流行的NoSql之一了。 
似水的流年
2018/01/14
2.7K0
跟我一起数据挖掘(21)——redis
什么是Redis Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工
cloudskyme
2018/03/20
8290
跟我一起数据挖掘(21)——redis
redis | 十三、jedis基本命令实践
根据jedis进行练习基本命令,string、list、set、hash、zset等命令。
雨中散步撒哈拉
2022/09/21
1900
Redis(五)-- Java API
一、pox.xml <dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId
码农小胖哥
2019/12/10
5060
redis【redis入门到精通】
Redisredis 是完全开源免费的,是一个高性能的key-value数据库,目前市面上主流的数据库 Redis、Memcache、Tair(淘宝自研发)
高大北
2022/06/27
5890
redis【redis入门到精通】
jediscluster 关闭 连接池_Redis——JedisCluster
执行命令的过程简单来说,就是通过CRC16计算出key的槽,根据节点映射直接访问目标节点,如果出错,就随机挑选一个节点,通过moved重定向访问目标节点,并且重新初始化节点映射。
全栈程序员站长
2022/11/18
1.5K0
手写dubbo 5-服务治理(redis番外篇)
博客中代码地址:https://github.com/farliu/farpc.git
并发笔记
2019/07/19
6020
手写dubbo 5-服务治理(redis番外篇)
redis的sentinel主从切换(failover)与Jedis线程池自动重连
本文介绍如何通过sentinel监控redis主从集群,并通过jedis自动切换ip和端口。 1、配置redis主从实例 10.93.21.21:6379 10.93.21.21:6389 10.93.21.21:6399 主从同步关系 master:10.93.21.21:6379 slave:10.93.21.21:6389,10.93.21.21:6399 master配置如下: # 实例ip和端口 bind 10.93.21.21 port 6379 # pid文件 pidfile redis_63
用户1225216
2018/03/05
2.3K0
Redis突然报错,今晚又不能回家了...
今天在容器环境发布服务,我发誓我就加了一行日志,在点击发布按钮后,我悠闲地掏出泡着枸杞的保温杯,准备来一口老年人大保健......
猿天地
2020/09/22
3.5K0
Redis突然报错,今晚又不能回家了...
jedispool使用自动归还jedis解决方案「建议收藏」
在使用jedispool的时候遇到一个尴尬的问题。实例必须要手动归还。即jedis高版本的jedis.close()来归还。 由于我们系统是用grpc做通信机制,所以不存在通过spring 管理实例的生命周期来控制,经研究决定也决定不采用Redisson. 那接下来只有用比较扎实的办法了。 封装一层实现归还。附上代码。。。有更强大的方法欢迎指导。 “` /* Title: Redis操作接口 * Description: * * @author wenquan * @date 2017年1月4日 */ public class RedisUtil { private static JedisPool pool = null;
全栈程序员站长
2022/10/03
9360
使用JedisPool资源池操作Redis,并进行性能优化
JedisPool保证资源在一个可控范围内,并且提供了线程安全,但是一个合理的GenericObjectPoolConfig配置能为应用使用Redis保驾护航,下面将对它的一些重要参数进行说明和建议:
小勇DW3
2019/06/11
1.5K0
相关推荐
【Redis】Java中使用Jedis操作Redis(Maven导入包)、创建Redis连接池
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档