redis是一个高性能的、支持网络、可基于内存的key-value存储机制的NoSQL数据库。基于内存的特性使得redis有非比寻常的性能优势。
关于redis的数据结构
作为key-value的数据库,redis存储的数据类型不止数值类型和字符串类型,还包括以下几种数据类型:
hash类型
hash类型是一种散列类型,和java中的hashMap很像,存储的值可以包括多个不重复字段,例如一个User对象的name和age都可以作为hash类型的一个字段,相对于将每个字段单独存储为String类型,hash类型更节省内存,因为redis的hash是用zipMap来存储的,并不是hashTable, zipmap 相比正常的 hash实现可以节省不少hash本身需要的一些存储开销,虽然这样使得hash的属性的添加、删除和查找的时间复杂度为O(n),但是一般用hash类型存储对象,而对象的属性一般不会太多,因此平均时间复杂度接近于O(1),并且,当field或value的大小超过一定大小时,redis会将hash类型从zipMap转换成正常的hash实现,这个限制可以在配置文件中如下指定
hash-max-zipmap-entries 64 #配置字段最多 64 个
hash-max-zipmap-value 512 #配置 value 最大为 512 字节
list类型
list类型是一种有序的列表类型,实现是用双向链表实现的。主要的功能有push、pop、获取列表中某个范围的元素等,存储的值都是string类型,list因为是双向链表结构,可以作为栈和队列使用。
set类型
set 类型是一种集合类型,它是无序的不可重复的,set是通过hashTable实现的,因而增删查找的复杂度都是O(1),set的操作包括set类型的交并补。
sortedSet类型
sortedSet是一种有序的Set类型,通过指定一个Score属性作为排序的域,这个域的值可以修改,每次指定score值后,sortedSet会对元素进行排序,因此插入的效率低于set,包括的功能和set类型相似,sortedSet最经常的使用方式应该是作为索引来使用.我们可以把要排序的字段作为score 存储,对象的id当元素存储。
jedis 介绍
jedis是一个用java写的redis数据库操作的客户端,通过jedis,可以很方便的对redis数据库进行操作,jedis的api的学习成本也很低,源码很简单,有时间的同学可以看一下源码,jedis很多对数据库的操作的方法名都是和redis-cli的API一致,关于redis-cli的API ,常用的有以下:
简单代码演示:
@Test
public void useJedis(){
//创建jedis对象
Jedis jedis = new Jedis("127.0.0.1",6379,5000);
//认证密码,如果没有密码不需要此步
jedis.auth("password");
//选择数据库序号
jedis.select(1);
//存值
jedis.set("testStringKey","Hello Redis!");
jedis.hset("testHashKey","msg","Hello Redis too!");
//取值
System.out.println(jedis.get("testStringKey"));
System.out.println(jedis.hget("testHashKey","msg"));
jedis.close();
}
/**
* 使用连接池
*/
@Test
public void useRedisPool(){
JedisPoolConfig config = new JedisPoolConfig();
//设置最大十个连接,具体编程需要根据情况配置
config.setMaxTotal(10);
JedisPool jedisPool = new JedisPool(config,"127.0.0.1",
6379,5000,"password");
Jedis jedis = jedisPool.getResource();
//存值
jedis.set("testStringKey","Hello Redis!");
jedis.hset("testHashKey","msg","Hello Redis too!");
//取值
System.out.println(jedis.get("testStringKey"));
System.out.println(jedis.hget("testHashKey","msg"));
/**
* 关闭资源,使用连接池的时候,jedis.close方法对资源的处理并不是释放,而是归还连接池
*/
jedis.close();
jedisPool.close();
}
更详细的jedis的API介绍移步jedis-2.9-doc