Redis
简介
目前的互联网应用广泛使用两种方式来进行数据存储,关系型数据库和NoSQL数据库。
- 关系型数据库是指采用关系模型来组织数据的数据库,主要用于存储格式化的数据结构,大量传统数据库如MySQL,Oracle,SQLServer等都属于关系型数据库。
- NoSQL数据库泛指非关系型数据库,主要服务于特定背景的专用数据库,对外提供的是特定的API,而非通用的SQL接口,数据访问更加高效。
Redis是一个开源的key-value数据库,属于NoSQL数据库,按照键值对的结构对数据进行存储,为了保证数据访问效率,数据都是缓存在内存中的,并基于内存操作,故性能较高。作为缓存应用,相比于其他类似的Memcached,Ehcache,OSCache等缓存器,它所支持v存储的value类型更多,包括string,list,set,zset和hash,Redis使业务能够高速和原子地访问这些数据结构,并且不需要关心持久存储的问题,从架构上解决了关系型数据库存储需要走一些弯路的问题。
针对不同的操作系统,Redis有Linux版和Windows版,
Windows版Redis的安装与配置
windows版的Redis可以从GitHub上获取 ,其发行版的下载地址为https://github.com/microsoftarchive/redis/releases可以选择msi格式的安装版或zip格式的压缩版。
|-----安装版安装
直接运行即可
|-----解压版安装:
第1步: 解压安装包到合适位置
第2步: 进入到Redis的安装目录下执行
redis-server --service-install redis.windows.conf --loglevel verbose
以上命令将redis-server.exe注册为Windows服务,并指定redis.windows.conf为其配置文件,可在该文件中调整Redis服务的参数。
执行redis-cli命令可以启动redis客户端。
|----卸载:
解压版:
sc delete Redis #卸载服务
删除安装目录
安装版:
正常卸载
操作Redis常用命令
添加数据:
set 键名 值
查询数据:
get 键名
修改数据:
set 旧键名 新值
rename 旧键名 新键名
删除数据:
del 键名
是否存在指定键: exists 键名1 键名2 …
模糊查询指定键; keys 正则表达式
有效时间:
expire 键名 秒数 # 设置键的有效时间
ttl 键名 #查询键的剩余有效时间
persist 键名 # 删除有效时间设置
选择数据库: select 数据库索引 # 默认16个仓库,索引为0-15
删除数据库数据: flushdb[当前] 或 flushall[所有]
在Java应用中访问Redis
若要在应用中访问Redis,就需要在应用中实现Redis客户端的功能。Jedis就是一个小巧强大的面向java语言的Redis客户端。
获取所需的组件
可以在https://search.maven.org网站上搜索Jedis的不同版本进行下载,此外还需要下载Apache Commons Pool 2 组件。使用Jedis所需的所有jar文件如下:
Jedis的使用思路
在Jedis中,封装Redis访问API的核心类是Jedis类,可以通过调用该类实例的方法实现对Redis的操作,在多线程环境下,不应该仅使用同一个Jedis实例,因为单个Jedis实例不是安全的。在多线程的环境下,应该使用JedisPool,它是一个线程安全的网络连接池,可以使用JedisPool可靠地创建多个Jedis实例,并在使用完毕后将Jedis实例归还到池中,这样可以减少错误并获得出色的性能。创建JedisPool所需要设置的参数可以通过JedisPoolConfig类进行封装。
使用Jedis操作Redis的代理实现如下
1.构建JedisPoolConfig及JedisPool:
public class JedisAPI {
private static JedisPool jedisPool;
static {
//创建并设置连接池配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);//连接池最大活动连接数
config.setMaxIdle(10);//连接池中的最大空闲连接数
config.setMinIdle(7);//连接池中的最小空闲连接数
config.setMaxWaitMillis(1000);//获取资源的等待时间
config.setTestOnBorrow(true);//获取资源时是否验证资源的有效性
//创建Jedis连接池
jedisPool = new JedisPool(
config,//连接池配置对象
"192.168.2.1",//Redis服务器地址
6379,//Redis服务端口
10000,//连接超时时间,单位为毫秒,默认为200ms
"",
0//数据库索引
);
}//static块结束
public void destroy(){
if (!(jedisPool==null || jedisPool.isClosed())){
jedisPool.close();//关闭数据库连接池
}
}
}
JedisPool是基于Apache Commons Pool 2 实现的,其配置参数完全可以参考Commons Pool 2 进行设置。
- maxTotal:最大活动连接数,默认为8,若设置为-1,则表示不限制。
- maxIdle:最大空闲连接数,默认为8。
- minIdle:最小空闲连接数,默认为0。
- maxWaitMillis:表示从池中获取一个资源时的最大等待时间,单位是毫秒,-1表示永不超时,如果超出等待时间,将抛出NoSuchElementException,进而引发JedisConnectionExcepion。
- testOnBorrow:表示从池中获取一个资源时是否提前进行验证操作。若该参数设置为true,则等到的资源均是可用的。
获取Jedis类的实例操作Redis
Jedis类的部分方法如下所示:
在上面实例的基础上增加操作Redis所需的方法:
public class JedisAPI {
private static JedisPool jedisPool;
static {
//创建并设置连接池配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);//连接池最大活动连接数
config.setMaxIdle(10);//连接池中的最大空闲连接数
config.setMinIdle(7);//连接池中的最小空闲连接数
config.setMaxWaitMillis(1000);//获取资源的等待时间
config.setTestOnBorrow(true);//获取资源时是否验证资源的有效性
//创建Jedis连接池
jedisPool = new JedisPool(
config,//连接池配置对象
"192.168.2.1",//Redis服务器地址
6379,//Redis服务端口
10000,//连接超时时间,单位为毫秒,默认为200ms
"",
0//数据库索引
);
}//static块结束
public void destroy(){
if (!(jedisPool==null || jedisPool.isClosed())){
jedisPool.close();//关闭数据库连接池
}
}
//增加操作Redis所需的方法
public boolean set(String key,String value){
Jedis jedis = null;
try {
jedis = jedisPool.getResource();//从池中获取Jedis实例
jedis.set(key,value);
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}finally {
//返还到连接池
if(jedis!=null){
jedis.close();
}
}
}
/**
* 获取数据
* @param key
* @return
*/
public String get(String key){
String value = null;
Jedis jedis=null;
try {
jedis = jedisPool.getResource(); //从池中获取Jedis实例
value = jedis.get(key);
}catch (Exception e){
e.printStackTrace();
}finally {
//返还到连接池
if(jedis!=null){
jedis.close();
}
}
return value;
}
}
最后进行测试
public class Test {
public static void main(String[] args) {
JedisAPI jedisAPI = new JedisAPI();
System.out.println(jedisAPI.get("a1"));
}
}