Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。Redis是 NoSQL技术阵营中的一员,它通过多种键值数据类型来适应不同场景下的存储需求,借助一些高层级的接口使用其可以胜任,如缓存、队列系统的不同角色。通过jedis可以在java客户端对redis进行一些操作。
注意:这一篇结合上一篇redis的常用操作看更佳,连接如下:redis常用操作
目录
1、jedis入门案例
2、string类型常见操作
3、list类型常见操作
4、hash类型常见操作
5、set类型常见操作
6、sorted类型常见操作
7、key的常见操作
8、redis数据可持久化
这里需要注意的是正常这样写会报错,我们首先需要导入jedis的jar包,同时我们需要进行如下3步操作:
public class RedisTest {
public static void main(String[] args) {
test1() ;
}
private static void test1() {
Jedis jedis = new Jedis("192.168.102.129") ;
jedis.auth("123456") ;
jedis.set("foo","bar") ;
System.out.println(jedis.get("foo"));
}
}
import redis.clients.jedis.Jedis;
import java.util.List;
public class RedisTest {
private static Jedis jedis ;
public static void main(String[] args) {
jedis = new Jedis("192.168.102.129") ;
jedis.auth("123456") ;
test1() ;
}
private static void test1() {
//测试set和get
jedis.set("username","tom") ;
System.out.println(jedis.get("username"));
//演示mset和mget
jedis.mset("password","123","age","18") ;
List values = jedis.mget("username","password","age") ;
System.out.println(values);
//演示append,setrange,getrange
jedis.append("username", " is boy") ;
System.out.println(jedis.get("username"));
jedis.setrange("username",7,"girl") ;
System.out.println(jedis.get("username"));
System.out.println(jedis.getrange("username",0,-1));
}
}
import redis.clients.jedis.BinaryClient;
import redis.clients.jedis.Jedis;
import java.util.List;
public class RedisTest {
private static Jedis jedis ;
public static void main(String[] args) {
jedis = new Jedis("192.168.102.129") ;
jedis.auth("123456") ;
test1() ;
}
private static void test1() {
//测试lpush和lrange
jedis.lpush("names","张三","李四","tom","john");
List list = jedis.lrange("names",0,-1) ;
System.out.println(list);
//测试lset
// jedis.lset("names",1,"王五") ;
// List list1 = jedis.lrange("names",0,-1) ;
// System.out.println(list1);
System.out.println(jedis.lindex("names",1));
//测试linsert
jedis.linsert("names", BinaryClient.LIST_POSITION.BEFORE,"tom","steve") ;
List list1 = jedis.lrange("names",0,-1) ;
System.out.println(list1);
//测试lrem
jedis.lrem("names",2,"tom") ;
List list2 = jedis.lrange("names",0,-1) ;
System.out.println(list2);
}
}
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class RedisTest {
private static Jedis jedis ;
public static void main(String[] args) {
jedis = new Jedis("192.168.102.129") ;
jedis.auth("123456") ;
test1() ;
}
private static void test1() {
//hset和hget测试
jedis.hset("user","username","tom") ;
String value = jedis.hget("user","username") ;
System.out.println(value);
//hmset和hmget
Map map = new HashMap() ;
map.put("password","123") ;
map.put("age","15") ;
map.put("sex","male") ;
map.put("username","james") ;
jedis.hmset("user",map) ;
List hmget = jedis.hmget("user", "username", "password", "age");
System.out.println(hmget) ;
//测试hgetall hkeys kvals
Map user = jedis.hgetAll("user");
for(String key : user.keySet()){
System.out.println(key + " " + map.get(key));
}
Set user1 = jedis.hkeys("user");
System.out.println(user1);
List user2 = jedis.hvals("user");
System.out.println(user2);
//测试hdel
jedis.hdel("user","username","password") ;
Map user3 = jedis.hgetAll("user");
System.out.println(user3);
}
}
import redis.clients.jedis.Jedis;
import java.util.Set;
public class RedisTest {
private static Jedis jedis ;
public static void main(String[] args) {
jedis = new Jedis("192.168.102.129") ;
jedis.auth("123456") ;
test1() ;
}
private static void test1() {
//测试sadd smembers
jedis.sadd("language1","java","c","python","matlab") ;
Set language1 = jedis.smembers("language1");
System.out.println(language1);
//测试srem
jedis.srem("language1","c") ;
Set language11 = jedis.smembers("language1");
System.out.println(language11);
//测试sdiff
jedis.sadd("l1","java","c","IOS","android") ;
jedis.sadd("l2","java","python","c++") ;
Set sdiff = jedis.sdiff("l1", "l2");
System.out.println(sdiff);
//测试sinter
Set sinter = jedis.sinter("l1", "l2");
System.out.println(sinter);
//测试sunion
Set sunion = jedis.sunion("l1", "l2");
System.out.println(sunion);
}
}
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class RedisTest {
private static Jedis jedis ;
public static void main(String[] args) {
jedis = new Jedis("192.168.102.129") ;
jedis.auth("123456") ;
test1() ;
}
private static void test1() {
//测试zadd zrange zrangeByScore
Map map = new HashMap() ;
map.put("张三",18.00) ;
map.put("李四",19.00) ;
map.put("王五",17.23) ;
map.put("马六",19.02) ;
jedis.zadd("zkey",map) ;
Set zkey = jedis.zrange("zkey", 0, -1);
System.out.println(zkey);
Set zkey1 = jedis.zrangeByScore("zkey", 17, 18);
System.out.println(zkey1);
//zrangeWithScores
Set zkey2 = jedis.zrangeWithScores("zkey", 0, -1);
for(Tuple t : zkey2){
System.out.println(t.getScore() + " " + t.getElement());
}
//zrank
System.out.println(jedis.zrank("zkey","李四")) ;
//zscore
System.out.println(jedis.zscore("zkey","李四"));
//zrem
jedis.zrem("zkey","李四") ;
System.out.println(jedis.zrange("zkey",0,-1));
}
}
import redis.clients.jedis.Jedis;
import java.util.Set;
public class RedisTest {
private static Jedis jedis ;
public static void main(String[] args) {
jedis = new Jedis("192.168.102.129") ;
jedis.auth("123456") ;
test1() ;
}
private static void test1() {
//keys pattern
Set s = jedis.keys("*") ;
System.out.println(s);
//del
jedis.del("user") ;
System.out.println(s);
//key的时间设置
jedis.expire("username",200) ;
Long ttl = jedis.ttl("username");
System.out.println(ttl);
jedis.persist("username") ;
}
}
8.1 redis数据持久化机制介绍
1). RDB持久化:该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。
2). AOF(append only file)持久化:该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。
3). 同时应用AOF和RDB。
4). 无持久化:可通过配置的方式禁用Redis服务器的持久化功能,这样我们就可以将Redis视为一个功能加强版的memcached了.
8.2 ROB和AOF对比
1). 数据的备份和恢复非常方便,因为一个数据库只有一个持久化文件
2). 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。
3). 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。
2.RDB又存在哪些劣势呢?
1).系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。
2). 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。
3.AOF的优势有哪些呢?
1). 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3种同步策略,即每秒同步、每修改同步和不同步。
2).对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。
3). 如果日志过大,Redis可以自动启用rewrite机制迅速“瘦身”(也可手动触发aof的rewrite操作,命令: bgrewriteaof)
4). AOF日志格式清晰、易于理解,很容易用AOF日志文件完成数据的重建。
4.AOF的劣势有哪些呢?
1). 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。
2). 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。