redis是基于key-value的内存存储系统,具有高性能,高可靠的特点。支持存储String、list、hash、set、zset等数据类型,这些数据都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中,Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
1、先把Redis的连接池拿出来
JedisPool pool = new JedisPool(new JedisPoolConfig(),"127.0.0.1");
Jedis jedis = pool.getResource();
2、对String类型的数据进行存取
Redis使用SDS(simple dynamic string) 封装,sds源码如下:
struct sdshdr{ unsigned int len; // 标记buf的长度 unsigned int free; //标记buf中未使用的元素个数 char buf[]; // 存放元素的坑 }
SDS 结构图如下:
Redis为什么选择SDS结构,而C语言原生的char[]
不香吗?
SDS中,O(1)时间复杂度,就可以获取字符串长度;而C 字符串,需要遍历整个字符串,时间复杂度为O(n)
存取代码举例如下:
jedis.set("key","value");
jedis.get("key");
jedis.del("key");
//给一个key叠加value
jedis.append("key","value2");//此时key的值就是value + value2;
//同时给多个key进行赋值:
jedis.mset("key1","value1","key2","value2");
3、 对hash类型的数据进行存取
hash类型数据redis内部编码实现使用的是ziplist(压缩列表)
、hashtable(哈希表),示例代码如下:
Map user = new HashMap();
user.put("key1","value1");
user.put("key2","value2");
user.put("key3","value3");
//存入
jedis.hmset("user",user);
//取出user中key1
List nameMap = jedis.hmget("user","key1");
//删除其中一个键值
jedis.hdel("user","key2");
//是否存在一个键
jedis.exists("user");
//取出所有的Map中的值:
Iterator iter = jedis.hkeys("user").iterator();
while(iter.next()){
jedis.hmget("user",iter.next());
}
4、 对list类型的数据进行存取
list类型数据redis内部实现使用的是ziplist(压缩列表)、linkedlist(链表),示例代码如下:
// 在key对应 list的头部添加字符串元素
jedis.lpush("a", "1");
jedis.lpush("a", "2");
jedis.lpush("a", "3");
// 在key对应 list 的尾部添加字符串元素
jedis.lpush("a", "4");
jedis.lpush("a", "5");
jedis.lpush("a", "6");
// 设置对应下标的值
jedis.lset("a", 1, "10");
// 获取对应下标的值
jedis.lget("a", 1);
5、 对set类型的数据进行存取
set类型数据在redis内部是用intset(整数集合)
、hashtable(哈希表)实现的,使用示例如下:
//向redis中添加Set集合数据
Long sAdd = jedis.sadd("set1", "a", "b", "c", "d", "d", "e", "f");
System.out.println("添加Set集合数据:" + sAdd);
//获取redis中的set1集合数据
Set set1 = jedis.smembers("set1");
System.out.println("获取Set集合数据:" + set1);
//删除redis中set1集合中指定的数据
Long sRem = jedis.srem("set1", "a", "b");
System.out.println("删除Set集合数据:" + sRem);
Set set2 = jedis.smembers("set1");
System.out.println("获取Set集合数据:" + set2);
//清空库表
jedis.flushDB();
6、 对zset类型的数据进行存取(有序集合)
zset在redis内部是使用ziplist(压缩列表)
、skiplist(跳跃表)实现,示例代码如下:
//向redis中添加zset数据
Long zAdd1 = jedis.zadd("city", 10d, "西安");
System.out.println("添加zset数据:" + zAdd1);
Long zAdd2 = jedis.zadd("city", 50d, "上海");
System.out.println("添加zset数据:" + zAdd2);
Long zAdd3 = jedis.zadd("city", 30d, "北京");
System.out.println("添加zset数据:" + zAdd3);
System.out.println("***********获取redis中zset数据***********");
System.out.println("获取redis中zset数据:");
//获取redis中zset数据
Set city = jedis.zrange("city", 0, -1);
for (String c : city){
System.out.println(c);
}
System.out.println("***********清空redis中的数据***********");
//清空redis中的数据
String s = jedis.flushDB();
System.out.println(s);
//关闭jedis
jedis.close();
运行结果:
添加zset数据:1
添加zset数据:1
添加zset数据:1
***********获取redis中zset数据***********
获取redis中zset数据:
西安
北京
上海
***********清空redis中的数据***********
ok
redis还支持如下三种特殊的数据类型:
Geo:Redis3.2推出的,地理位置定位,用于存储地理位置信息,并对存储的信息进行操作。
HyperLogLog:用来做基数统计算法的数据结构,如统计网站的UV。
Bitmaps :用一个比特位来映射某个元素的状态,在Redis中,它的底层是基于字符串类型实现的,可以把bitmaps成作一个以比特位为单位的数组