redis基础
来源:互联网 发布:青岛中德生态园 知乎 编辑:程序博客网 时间:2024/05/22 11:39
使用redis也有一段时间了,今天就总结写些基础基本的东西吧。
redis是干什么的,相信很多人都知道了,百度google一下就很多,说白了就是一个noSQL的内存数据库。相信很多人像我一样是使用windows平台开发的,所以开发时需要用虚拟机或者在实体机器上安装一个linux类的系统,或者找一个windows版。
这个据说是ms移植:https://github.com/MSOpenTech/redis,不过了就要自己编译,有兴趣的可以研究一下源码。
这里有已经编译好的可以下载:https://github.com/dmajkic/redis/downloads,就是版本不是很新而已。
同时还需要下载java的客户端https://github.com/xetorthio/jedis,虽然还有其它可用的,不过这个是官方推荐加上是使用最多的。jedis就要自己编译了(可以找一下别人编译好的也可以啦),其实也很简单。下载源码,新建java项目,把src\main\java下面复制到src里面,使用ide的export导出jar,有报错也可以导出,只要在使用前加上下面这个就行了。
commons-pool:http://commons.apache.org/proper/commons-pool/download_pool.cgi,这个jedis在使用连接池用到的,根据jdk下载吧。
使用maven之类就百度google一下。
解压下载的redis,运行redis-server.exe,在ide(自己使用myeclipse)新建项目之类的跳过啦。
最简单的使用:
Jedis jedis = new Jedis("localhost", 6379); jedis.set("a", "redis"); String value = jedis.get("a"); System.out.println(value); jedis.close();当想全局使用一个redis连接的话,这样还不行,需要在使用前先判断连接是否可用:
if (jedis.ping().equals("PONG")) {}
只是一般很少这样做就像连接数据库一样,不会整个项目都使用一个Connection。
在实际使用中,一般会采用连接池的方式:
private JedisPool jedisPool;public void initPool() { JedisPoolConfig config = new JedisPoolConfig(); //配置一个pool最多有多少个状态为idle(空闲的)的jedis实例。 config.setMaxIdle(20); //配置一个pool最少有多少个状态为idle(空闲的)的jedis实例。 config.setMinIdle(1); //获取jedis实例是最多等待的时间 config.setMaxWaitMillis(1000); //jedis最多连接数 config.setMaxTotal(100); //在去连接时是否判断可用有效 config.setTestOnBorrow(true); //归还连接池是是否测试可用 //config.setTestOnReturn(true); jedisPool = new JedisPool(config, "localhost", 6379); } public void testKey() { //获取jedis实例 Jedis jedis = jedisPool.getResource(); // 清空数据 System.out.println(jedis.flushDB()); // 判断key"a"是否存在 System.out.println(jedis.exists("a")); jedis.set("a", "values"); System.out.println(jedis.exists("a")); jedisPool.returnResource(jedis); }
JedisPoolConfig的其它参数可根据实际情况配置,建议使用配置文件。
很多人到这一步就完成了。其实这里还是有些缺陷吧。上面的写法不适合用在真实使用的环境。因为当我们new一个对象,再调用initPool时,已经产生了一个连接池,如果别人也new一个又产生了一个连接池,这样就失去使用连接池的意义了。解决方向就是整个应用只使用一个连接池:单例或者static。
下面是使用static的:
public class Test2 { private static JedisPool jedisPool; static { JedisPoolConfig config = new JedisPoolConfig(); // 配置一个pool最多有多少个状态为idle(空闲的)的jedis实例。 config.setMaxIdle(20); // 配置一个pool最少有多少个状态为idle(空闲的)的jedis实例。 config.setMinIdle(1); // 获取jedis实例是最多等待的时间 config.setMaxWaitMillis(1000); // jedis最多连接数 config.setMaxTotal(100); // 在去连接时是否判断可用有效 config.setTestOnBorrow(true); // 归还连接池是是否测试可用 // config.setTestOnReturn(true); jedisPool = new JedisPool(config, "localhost", 6379); } public void testKey() { // 获取jedis实例 Jedis jedis = jedisPool.getResource(); // 清空数据 System.out.println(jedis.flushDB()); // 判断key"a"是否存在 System.out.println(jedis.exists("a")); jedis.set("a", "values"); System.out.println(jedis.exists("a")); jedisPool.returnResource(jedis); }}
单例的就不写了,想过几天写篇单例的用这个作为例子。
还有一种使用的也很多的就是ShardedJedisPool,分布式时使用,其实和上面也差不多:
public class Test3 { private static ShardedJedisPool shardedJedisPool; static { JedisPoolConfig config = new JedisPoolConfig(); //配置一个pool最多有多少个状态为idle(空闲的)的jedis实例。 config.setMaxIdle(20); //配置一个pool最少有多少个状态为idle(空闲的)的jedis实例。 config.setMinIdle(1); //获取jedis实例是最多等待的时间 config.setMaxWaitMillis(1000); //jedis最多连接数 config.setMaxTotal(100); //在去连接时是否判断可用有效 config.setTestOnBorrow(true); //归还连接池是是否测试可用 //config.setTestOnReturn(true); List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>(); shards.add(new JedisShardInfo("localhost", 6379)); shards.add(new JedisShardInfo("localhost", 6378)); // 构造池 shardedJedisPool = new ShardedJedisPool(config, shards); } public void testKey() { // 获取jedis实例 ShardedJedis jedis = shardedJedisPool.getResource(); // 判断key"a"是否存在 System.out.println(jedis.exists("a")); jedis.set("a", "values"); System.out.println(jedis.exists("a")); shardedJedisPool.returnResource(jedis); }}
细心的应该发现testKey里面 没有了jedis.flushDB()这个操作,使用ShardedJedisPool要清空数据要一个一个db清空,另外jedis有jedis.select选择数据库的,ShardedJedisPool是没有的。
另外,说一下修改redis端口。打开redis目录下的redis.conf,找到这个位置:
# Accept connections on the specified port, default is 6379.# If port 0 is specified Redis will not listen on a TCP socket.port 6379# If you want you can bind a single interface, if the bind option is not# specified all the interfaces will listen for incoming connections.## bind 127.0.0.1
修改6379为其它端口,不要直接双击redis-server.exe启动,在命令行启动 ,切换到redis目录,输入redis-server.exe redis.conf就行了。
PS: 当出现异常时,要销毁对象使用 returnBrokenResource, 使用完之后要归还连接returnResource。
参考:
http://budairenqin.iteye.com/blog/1734193 里面的封装方式个人挺喜欢的,有兴趣的可以参考一下。
http://redis.readthedocs.org/en/latest/ redis客户端的命令,也很有用的
- Redis基础
- Redis基础
- redis基础
- Redis基础
- redis基础
- redis 基础
- redis基础
- Redis基础
- redis基础
- Redis基础
- Redis基础
- Redis 基础
- redis基础
- Redis基础
- Redis基础
- redis基础
- Redis基础
- redis基础
- Modernizr:为HTML 5和CSS3而生
- hdu 1284 钱币兑换问题(完全背包)
- 每日一小练——最长平台问题
- 还是Flash垃圾回收那点事(转)
- android学习之网络图片查看器
- redis基础
- 我的博客开通了
- 求数a与数b的正差值
- bootstrap中按钮的使用样式
- Lua脚本在C++下的舞步一
- 字符串的亲属关系判断
- 【iOS】instantiateViewControllerWithIdentifier初始化传值
- 天堂在下,地狱在上
- 二叉树(五)二叉树中某一路径之和为某一整数