Redis系列八 使用Jedis

使用Jedis jar操作Redis

1、配置redis.conf文件,修改

  

2、建java工程,加入 jedis jar包

  

3、代码示例:

  1 package com.ntjr.redis;
  2
  3 import java.util.HashMap;
  4 import java.util.Iterator;
  5 import java.util.List;
  6 import java.util.Map;
  7 import java.util.Set;
  8
  9 import org.junit.Before;
 10 import org.junit.Test;
 11
 12 import redis.clients.jedis.Jedis;
 13
 14 public class TestApi {
 15     private Jedis jedis;
 16
 17     /**
 18      * 连接192.168.15.128:6379 Redis
 19      */
 20     @Before
 21     public void before() {
 22         jedis = new Jedis("192.168.15.128", 6379);
 23     }
 24
 25
 26     /**
 27      * 测试set get  及 过期时间,返回-1代表永不过期
 28      */
 29     @Test
 30     public void testSetKey() {
 31         jedis.set("k1", "v1");
 32         jedis.set("k2", "v2");
 33         jedis.set("k3", "v3");
 34         System.out.println(jedis.get("k3"));
 35         System.out.println(jedis.ttl("k1"));
 36     }
 37
 38
 39     /**
 40      * 获取所有的key
 41      */
 42     @Test
 43     public void testGet() {
 44         Set<String> keys = jedis.keys("*");
 45         for (Iterator<String> iterator = keys.iterator(); iterator.hasNext();) {
 46             String key = (String) iterator.next();
 47             System.out.println(key);
 48         }
 49     }
 50
 51     /**
 52      * 是否存在k2
 53      */
 54     @Test
 55     public void testExists() {
 56         System.out.println(jedis.exists("k2"));
 57     }
 58
 59     /**
 60      * string 追加
 61      */
 62     @Test
 63     public void testAppend() {
 64         jedis.append("k1", "myredis");
 65         System.out.println(jedis.get("k1"));
 66     }
 67
 68     /**
 69      * 设置多个键值对
 70      */
 71     @Test
 72     public void testMSET() {
 73         jedis.mset("str1", "v1", "str2", "v2", "str3", "v3");
 74         System.out.println(jedis.mget("str1", "str2", "str3"));
 75     }
 76
 77     /**
 78      * 测试为list设置值,获取list集合
 79      */
 80     @Test
 81     public void testLPUSH() {
 82         jedis.lpush("mylist", "v1", "v2", "v3", "v4", "v5");
 83         List<String> myList = jedis.lrange("mylist", 0, -1);
 84         for (String element : myList) {
 85             System.out.println(element);
 86         }
 87     }
 88
 89     /**
 90      * Set集合的添加、遍历、删除
 91      */
 92     @Test
 93     public void testSet() {
 94         jedis.sadd("orders", "jd001");
 95         jedis.sadd("orders", "jd002");
 96         jedis.sadd("orders", "jd003");
 97         Set<String> orders = jedis.smembers("orders");
 98         for (Iterator<String> iterator = orders.iterator(); iterator.hasNext();) {
 99             System.out.println(iterator.next());
100         }
101         jedis.srem("orders", "jd002");
102         System.out.println(jedis.smembers("orders").size());
103     }
104
105     /**
106      * Map集合操作,获取多个值
107      */
108     @Test
109     public void testHash() {
110         jedis.hset("hash1", "uername", "lisi");
111         System.out.println(jedis.hget("hash1", "uername"));
112         Map<String, String> map = new HashMap<>();
113         map.put("telphone", "13811814763");
114         map.put("address", "atguigu");
115         map.put("email", "[email protected]");
116         jedis.hmset("hash1", map);
117         List<String> result = jedis.hmget("hash1", "telphone", "email");
118         for (String element : result) {
119             System.out.println(element);
120         }
121     }
122
123     /**
124      * Zset设置,为每个数据设置 score
125      */
126     @Test
127     public void testZSET() {
128         jedis.zadd("zset01", 60d, "v1");
129         jedis.zadd("zset01", 70d, "v2");
130         jedis.zadd("zset01", 80d, "v3");
131         jedis.zadd("zset01", 90d, "v4");
132         Set<String> zset = jedis.zrange("zset01", 0, -1);
133         for(Iterator<String> iterator = zset.iterator();iterator.hasNext(); ){
134             System.out.println(iterator.next());
135         }
136     }
137
138 }

4、使用JedisPool连接池

 1 package com.ntjr.redis;
 2
 3 import redis.clients.jedis.Jedis;
 4 import redis.clients.jedis.JedisPool;
 5 import redis.clients.jedis.JedisPoolConfig;
 6
 7 public class JedisPoolUtils {
 8
 9     private static volatile JedisPool jedisPool = null;
10
11     private JedisPoolUtils() {
12     }
13
14     public static JedisPool getJedisPoolInstance() {
15         synchronized (JedisPoolUtils.class) {
16             if (jedisPool == null) {
17                 synchronized (JedisPoolUtils.class) {
18                     if (jedisPool == null) {
19                         JedisPoolConfig poolConfig = new JedisPoolConfig();
20                         poolConfig.setMaxActive(1000);
21                         poolConfig.setMaxIdle(30);
22                         poolConfig.setMaxWait(100*1000);
23                         poolConfig.setTestOnBorrow(true);
24                         jedisPool = new JedisPool(poolConfig, "192.168.15.128", 6379);
25                     }
26                 }
27             }
28         }
29         return jedisPool;
30     }
31
32
33
34     public static void release(JedisPool jedisPool,Jedis jedis){
35         if(jedis!=null){
36             jedisPool.returnResourceObject(jedis);
37         }
38     }
39
40 }

5、JedisPool配置参数

  JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。
  maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。
  maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;
  whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。
   WHEN_EXHAUSTED_FAIL --> 表示无jedis实例时,直接抛出NoSuchElementException;
   WHEN_EXHAUSTED_BLOCK --> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;
   WHEN_EXHAUSTED_GROW --> 则表示新建一个jedis实例,也就说设置的maxActive无用;
  maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException;
  testOnBorrow:获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的

  testOnReturn:return 一个jedis实例给pool时,是否检查连接可用性(ping());  

  testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;  

  timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数;

  numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数;

  minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;

  softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义;

  lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列;

==================================================================================================================
  其中JedisPoolConfig对一些参数的默认设置如下:
  testWhileIdle=true
  minEvictableIdleTimeMills=60000
  timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1

  

时间: 2024-10-02 11:25:00

Redis系列八 使用Jedis的相关文章

Redis系列八:redis主从复制和哨兵

一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性 1. 主从复制的相关操作 a,配置主从复制方式一.新增redis6380.conf, 加入 slaveof 192.168.1.111 6379, 在6379启动完后再启6380,完成配置:b,配置主从复制方式二.redis-server --slaveof 192.168.1.111 6379 临时生效 c,查看状态:info replicationd,断开主从复制:在slave

Redis系列(三)--过期策略

制定Redis过期策略,是整个Redis缓存策略的关键之一,因为内存来说,公司不可能无限大,所以就要对key进行一系列的管控. 文章结构:(1)理解Redis过期设置API(命令与Java描述版本):(2)理解Redis内部的过期策略:(3)对开发需求而言,Redis过期策略的设计实现经验. 本系列文章: (1)Redis系列(一)–安装.helloworld以及读懂配置文件 (2)Redis系列(二)–缓存设计(整表缓存以及排行榜缓存方案实现) 一.理解Redis过期设置API(命令与Java

redis系列:redis介绍与安装

前言 这个redis系列的文章将会记录博主学习redis的过程.基本上现在的互联网公司都会用到redis,所以学习这门技术于你于我都是有帮助的. 博主在写这个系列是用的是目前最新版本4.0.10,虚拟机装的是4.0.10,为了方便window也安装了(版本3.2.100).后续命令会采用命令行,jedis和spring集成jedis这三种方式进行操作. 在这片博文的开始,可以先试着问几个问题,带着问题看博文,或许能更有收获. 什么是redis? 为什么要使用redis? 如何搭建redis环境?

Redis的常用JavaAPI(Jedis)实现

一.  pom依赖: <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version></dependency> 二.创建 jedis对象

redis系列:分布式锁

redis系列:分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分为两部分,一个是单机环境,另一个是集群环境下的Redis锁实现.在介绍分布式锁的实现之前,先来了解下分布式锁的一些信息. 2 分布式锁 2.1 什么是分布式锁? 分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,如果不同的系统或同一个系统的不同主机之间共享了某个资源时,往往需要互斥

8.【Redis系列】Redis的高级应用-简单限流

原文:8.[Redis系列]Redis的高级应用-简单限流 限流在分布式系统中是一个经常被提到的话题,如果当前系统的能力,不足以承受那么大的访问量的时候,那么我们就要阻止外来请求对系统继续施压 实现简单限流 首先我们来看一个常见的简单限流策略,系统要限制每个用户在一定时间内的某个行为只能操作N次,如何是用redis的数据结构来实现这个限流的功能呢. 解决方案 这个限流需求中存在一个滑动时间窗口,想想 zset 数据结构的 score 值,是不是可以通过 score 来圈出这个时间窗口来.而且我们

6.【Redis系列】Redis的高级应用-HyperLogLog

原文:6.[Redis系列]Redis的高级应用-HyperLogLog 老规矩还是先假设一个场景:比如京东的商品详情页,如果需要你来统计每天的UV数据,你会如何实现? 如果是PV就好办了,直接给每个网页增加一个计时器,每个网页增加一个日期,这样一进来incrby一次,最终可以计算出每天的统计所有的PV数据. 但是UV就不一样了,每一个用户进来多次每天也只能算一个UV.无论是登录用户还是未登录用户,都需要给一个唯一的ID来标识. 有可能你已经想到了通过set集合去重的功能,为每一个页面创建一个s

Redis系列(1)之安装

Redis系列(1)之安装 由于项目的需要,最近需要研究下Redis.Redis是个很轻量级的NoSql内存数据库,它有多轻量级的呢,用C写的,源码只有3万行,空的数据库只占1M内存.它的功能很丰富,可以将其用作缓存,队列系统等.我们的项目就是用其作为缓存系统.关于Redis的介绍这里就不多说,刚上手完了一会,感觉还不错.那么熟悉Redis就从安装开始. 1. Redis 单机的安装 相比于Hbase的安装,Redis的安装非常简单. 首先从官网上下载安装包,注意Redis的版本规则是次版本(即

Redis系列三:Redis常用设置

一.redis的配置文件redis.conf位置 centos:默认在/etc/redis.conf ubuntu:可以从解压缩后的目录里将配置文件复制到该目录 二.启动redis时指定配置文件 $redis-server /etc/redis.conf 三.常用配置说明 daemonize yes #设置后台运行,默认redis不在后台运行 logfile "/var/log/redis.log" #设置log文件地址,默认使用标准输出,即直接打印在命令行终端的窗口上 require