Redis 简介
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
- Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
- Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
redis 数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
字符串、整型和浮点数
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
字符串
public static void testString() {
try {
jedis.select(1);
jedis.flushDB();
System.out.println("====字符串功能展示====");
System.out.println("增:");
System.out.println(jedis.set("a", "1"));
System.out.println(jedis.set("b", "2"));
System.out.println(jedis.set("c", "3"));
System.out.println("删除键 a:" + jedis.del("a"));
System.out.println("获取键 a:" + jedis.get("a"));
System.out.println("修改键 b:" + jedis.set("b", "bChanged"));
System.out.println("获取键 b 的值:" + jedis.get("b"));
System.out.println("在键 c后面加入值:" + jedis.append("c", "End"));
System.out.println("获取键 c的值:" + jedis.get("c"));
System.out.println("增加多个键值对:" + jedis.mset("key01", "value01", "key02", "value02", "key03", "value03"));
System.out.println("获取多个键值对:" + jedis.mget("key01", "key02", "key03"));
System.out.println("获取多个键值对:" + jedis.mget("key01", "key02", "key03", "key04"));
System.out.println("删除多个键值对:" + jedis.del(new String[]{"key01", "key02"}));
System.out.println("获取多个键值对:" + jedis.mget("key01", "key02", "key03"));
jedis.flushDB();
System.out.println("新增键值对防止覆盖原先值:");
System.out.println(jedis.setnx("key001", "value001"));
System.out.println(jedis.setnx("key002", "value002"));
System.out.println(jedis.setnx("key002", "value002-new"));
System.out.println("获取键key001的值:" + jedis.get("key001"));
System.out.println("获取键key002的值:" + jedis.get("key002"));
System.out.println("新增键值对并设置有效时间:");
System.out.println(jedis.setex("key003", 2, "value003"));
System.out.println("获取键key003的值:" + jedis.get("key003"));
TimeUnit.SECONDS.sleep(3);
System.out.println("获取键key003的值:" + jedis.get("key003"));
System.out.println("获取原值,更新为新值:");
System.out.println(jedis.getSet("key002", "key2GetSet"));
System.out.println("获取键key002的值:" + jedis.get("key002"));
System.out.println("截取key002的值的字符串:" + jedis.getrange("key002", 2, 5));
System.out.println("");
} catch (Exception e) {
e.printStackTrace();
}
}
输出结果:
====字符串功能展示====
增:
OK
OK
OK
删除键 a:1
获取键 a:null
修改键 b:OK
获取键 b 的值:bChanged
在键 c后面加入值:4
获取键 c的值:3End