Redis 和数据库连接池

一、先来搞清楚两个问题:Redis 到底是什么,数据库连接池又是怎么一回事?

  1. Redis 是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

    Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。

    Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

   2. 数据库连接池:

       数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

二、 redis_java操作

Jedis 客户端实现

Maven pom文件 加入依赖

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependencies>  
   <dependency>  
     <groupId>redis.clients</groupId>  
     <artifactId>jedis</artifactId>  
     <version> 2.1 . 0 </version>  
   </dependency>  
     
   <dependency>  
     <groupId>junit</groupId>  
     <artifactId>junit</artifactId>  
     <version> 4.8 . 2 </version>  
     <scope>test</scope>  
   </dependency>  
</dependencies>

Jedis 简单使用

?
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* 
  * JedisTest.java 
  */  
package com.x.java2000_wl;  
   
import org.junit.Before;  
import org.junit.Test;  
   
import redis.clients.jedis.Jedis;  
   
/** 
  * jedis 简单使用 
  * @author http://blog.csdn.net/java2000_wl 
  * @version <b>1.0</b> 
  */  
public class JedisSimpleTest {  
   
     private Jedis jedis;  
       
     /** 
      * 初始化连接 
      * <br>------------------------------<br> 
      */  
     @Before  
     public void beforeClass() {  
         jedis = new Jedis("127.0.0.1");  
         jedis.auth("java2000_wl");  
     }  
       
     /** 
      * set 新增 
      * <br>------------------------------<br> 
      */  
     @Test  
     public void testSet() {  
         jedis.set("blog", "java2000_wl");  
     }  
       
     /** 
      *  获取 
      * <br>------------------------------<br> 
      */  
     @Test  
     public void testGet() {  
         System.out.println(jedis.get("blog"));  
     }  
       
     /** 
      * 修改key 
      * <br>------------------------------<br> 
      */  
     @Test  
     public void testRenameKey() {  
         jedis.rename("blog", "blog_new");  
     }  
       
     /** 
      * 按key删除 
      * <br>------------------------------<br> 
      */  
     @Test  
     public void testDel() {  
         jedis.del("blog_new");  
     }  
       
     /** 
      * 获取所有的key  
      * <br>------------------------------<br> 
      */  
     @Test  
     public  void  testKeys() {  
         System.out.println(jedis.keys( "*" ));  
     }  
}

使用commons-pool连接池

?
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/* 
  * JedisPoolTest.java 
  */  
package com.x.java2000_wl;  
   
import java.util.ResourceBundle;  
   
import org.junit.Assert;  
import org.junit.BeforeClass;  
import org.junit.Test;  
   
import redis.clients.jedis.Jedis;  
import redis.clients.jedis.JedisPool;  
import redis.clients.jedis.JedisPoolConfig;  
   
/** 
  * jedis Pool 操作 
  * @author http://blog.csdn.net/java2000_wl 
  * @version <b>1.0</b> 
  */  
public class JedisPoolTest {  
   
     private static JedisPool jedisPool;  
       
     /** 
      * initPoolConfig 
      * <br>------------------------------<br> 
      * @return 
      */  
     private static JedisPoolConfig initPoolConfig() {  
         JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();  
         // 控制一个pool最多有多少个可用的的jedis实例  
         jedisPoolConfig.setMaxActive(1000);   
         // 最大能够保持空闲状态的对象数  
         jedisPoolConfig.setMaxIdle(300);  
         // 超时时间  
         jedisPoolConfig.setMaxWait(1000);  
         // 在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;  
         jedisPoolConfig.setTestOnBorrow(true);   
         // 在还会给pool时,是否提前进行validate操作  
         jedisPoolConfig.setTestOnReturn(true);  
         return jedisPoolConfig;  
     }  
       
     /** 
      * 初始化jedis连接池 
      * <br>------------------------------<br> 
      */  
     @BeforeClass  
     public  static  void  before() {  
         JedisPoolConfig jedisPoolConfig = initPoolConfig();    
         // 属性文件读取参数信息  
         ResourceBundle bundle = ResourceBundle.getBundle( "redis_config" );  
         String host = bundle.getString( "redis.host" );  
         int  port = Integer.valueOf(bundle.getString( "redis.port" ));  
         int  timeout = Integer.valueOf(bundle.getString( "redis.timeout" ));  
         String password = bundle.getString( "redis.password" );  
         // 构造连接池  
         jedisPool =  new  JedisPool(jedisPoolConfig, host, port, timeout, password);  
     }  
   
     @Test  
     public  void  testSet() {  
         Jedis jedis =  null ;   
         // 从池中获取一个jedis实例  
         try  {  
             jedis = jedisPool.getResource();  
             jedis.set( "blog_pool" "java2000_wl" );  
         catch  (Exception e) {  
             // 销毁对象  
             jedisPool.returnBrokenResource(jedis);  
             Assert.fail(e.getMessage());  
         finally  {  
             // 还会到连接池  
             jedisPool.returnResource(jedis);  
         }  
     }         
       
     @Test  
     public  void  testGet() {  
         Jedis jedis =  null ;   
         try  {  
             // 从池中获取一个jedis实例  
             jedis = jedisPool.getResource();  
             System.out.println(jedis.get( "blog_pool" ));  
         catch  (Exception e) {  
             // 销毁对象  
             jedisPool.returnBrokenResource(jedis);  
             Assert.fail(e.getMessage());  
         finally  {  
             // 还会到连接池  
             jedisPool.returnResource(jedis);  
         }  
     }  
}

http://www.open-open.com/lib/view/open1421133718968.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis数据库连接池是一种用于管理和复用数据库连接的技术。通过连接池,可以在需要时从池中获取数据库连接,而不需要每次都建立新的连接,从而提高了数据库访问的效率和性能。 使用连接池可以避免频繁地创建和销毁连接,减少了系统开销,并且可以更有效地利用数据库资源。连接池维护了一组预先创建的数据库连接,当需要访问数据库时,可以从连接池中获取一个空闲的连接,并在使用完毕后将连接返回给连接池,以供其他请求使用。 在Python中,可以使用第三方库如redis-py来实现Redis数据库连接池。引用中的代码示例展示了如何使用半连接池,通过创建一个单例的连接池对象,从连接池中获取连接并进行操作。而引用中的实例示范展示了直接使用Redis库来创建连接和获取数据。 连接池的使用可以提高多线程环境下的性能和并发访问的效率,同时也能减少对数据库的连接和断开操作,从而降低了系统开销。在实际应用中,可以根据具体需求调整连接池的大小和配置参数,以满足系统的性能和并发需求。 总结起来,Redis数据库连接池是一种用于管理和复用数据库连接的技术,通过使用连接池可以提高数据库访问的效率和性能,减少系统开销,并且更有效地利用数据库资源。在Python中可以使用第三方库来实现连接池,并根据具体需求进行配置和使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Redis的介绍以及简单使用连接池](https://blog.csdn.net/MeiJin_/article/details/127853975)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值