Redis
一、Redis概念
Redis是一款性能极高的非关系型数据库(NOSQL系列)。与之对应的是我们经常使用的关系型数据库,如:MYSQL、Oracle等等,关系型数据库的数据主要是以表的形式存储在硬盘的文件上,数据之间存在关联关系;而非关系型数据库的数据主要是以key:value即键值对的形式存储在内存当中,数据之间没有任何的关联关系。
二、Redis的安装
官网:https://redis.io
中文网:http://www.redis.net.cn
此处以Windows64位版本的Redis为例,下载好的压缩包直接解压就可以使用,在解压的文件夹中,我们主要使用的是redis.windows.conf(配置文件)、redis-cli.exe(客户端)、redis-server.exe(Redis的服务器端);直接双击redis-server.exe启动服务器,可以看到Redis的相应版本,port端口,进程PID。此时双击redis-cli.exe启动客户端,可以通过"set username jason"和"get username"的方式存取username。
三、Redis数据结构
Redis存储的是:key,value键值对格式的数据,其中key都是字符串,value则有5中不同的数据结构:
1、字符串类型(String)
2、哈希类型(hash):存储map格式,value又是key,value的形式
3、列表类型(list):存储linkedlist格式,list元素可以重复
4、集合类型(set):set集合元素不可以重复r
5、有序集合类型(sortedset):sortedset集合既不能让元素重复,元素存到集合中之后还会给元素排序
四、Redis命令操作
1、字符串类型(String)
存储:set key value
获取:get key
删除:del key
2、哈希类型(hash)
存储:hset key field value (hset person username lisi)(hset person password 123456)
获取:
获取指定的field对应的值:hget key field (hget person username)
获取所有的field和value:hgetall key
删除:hdel key field (hdel person username)
3、列表类型(list)
可以添加一个元素到列表的头部或者尾部,用lpush往左边即头部添加,用rpush往右边即尾部添加。
添加:
左加:lpush key value
右加:rpush key value
获取:
范围获取:lrange key start end
删除:
lpop key:删除列表最左边的元素,并将元素返回
rpop key:删除列表最右边的元素,并将元素返回
4、集合类型(set)
添加:sadd key value
获取:smembers key(获取set集合中的所有元素)
删除:srem key value
5、集合类型(sortedset)
添加:zadd key score value
获取:zrange key start end (zrange person 0 -1)若要查看存入的分数则为(zrange person 0 -1 withscores)
删除:zrem key value
6、通用命令
keys * :查询所有的键
type key :获取键对应的value的类型
del key :删除指定的key value
五、Redis持久化
Redis是一个内存数据库,当Redis服务器重启或者是电脑重启时,数据就会丢失,然而,我们可以将数据持久化保存到硬盘的文件中,就可以解决这一问题。
Redis持久化机制:
RDB:默认方式,不需要进行配置,默认就使用这种机制(在一定的时间间隔内,检测key的变化情况,然后持久化)
编辑Redis.windows.conf文件
save 900 1(在900秒内有至少1个key被修改就持久化一次)
save 300 10(在300秒内有至少10个key被修改就持久化一次)
save 60 10000(在60秒内有至少10000个key被修改就持久化一次)
修改了之后重新启动服务器(在redis-server.exe所在目录下打开控制台),输入命令:redis-server.exe redis.windows.conf 操作
AOF:日志的记录方式,可以记录每一条命令的操作。可以每一次命令操作之后,持久化数据。
编辑Redis.windows.conf文件
appendonly no(默认是关闭) -->appendonly yes(开启aof)
appendfsync always :每一次操作都进行持久化
appendfsync everysec:没隔一秒进行持久化
appendfsync no:不进行持久化
修改了之后重新启动服务器(在redis-server.exe所在目录下打开控制台),输入命令:redis-server.exe redis.windows.conf 操作
六、Jedis入门
Jedis是一款Java操作redis数据库的工具。
这里可以创建一个maven项目,也可以创建简单的java工程,只需要导入连接池和jedis的jar包即可,如果编写测试类测试,还需要导入junit的jar包。
1 public class RedisTest { 2 @Test 3 public void test(){ 4 //获取连接 5 Jedis jedis = new Jedis("127.0.0.1",6379);//如果使用空参构造,默认值是“localhost”,6379端口 6 //操作 7 jedis.set("username","xiaobaitu"); 8 //关闭连接 9 jedis.close(); 10 } 11 }
运行程序,打开客户端,输入命令"keys * ",可以看到username,通过“ get username ”就可以拿到值“xiaobaitu”。
Jedis操作各种redis中的数据结构:
1、字符串类型(String)
set/get
1 @Test 2 public void test2(){ 3 //获取连接 4 Jedis jedis = new Jedis("127.0.0.1",6379); 5 //操作 6 jedis.set("username","xiaobaitu"); 7 //获取 8 String username = jedis.get("username"); 9 System.out.println(username); 10 //可以使用setex()方法存储指定过期时间的key value 11 jedis.setex("activecode",50,"jedis");//运行程序,会将activecode:jedis存入redis,50秒后会自动删除该键值对 12 //关闭连接 13 jedis.close(); 14 }
2、哈希类型(hash):存储map格式,value又是key,value的形式
hset/hget/hgetall
1 @Test 2 public void test3(){ 3 //获取连接 4 Jedis jedis = new Jedis("127.0.0.1",6379); 5 //操作 6 jedis.hset("user","name","jedis"); 7 jedis.hset("user","age","18"); 8 jedis.hset("user","sex","mal"); 9 //获取hash 10 Map<String,String> user = jedis.hgetAll("user"); 11 Set<String> keyset = user.keySet(); 12 for (String s : keyset) { 13 System.out.println(s+":"+user.get(s)); 14 } 15 //关闭连接 16 jedis.close(); 17 }
3、列表类型(list):存储linkedlist格式,list元素可以重复
lpush、rpush、lpop、rpop、lrange start end
1 @Test 2 public void test4(){ 3 //获取连接 4 Jedis jedis = new Jedis("127.0.0.1",6379); 5 //操作 6 jedis.lpush("list","abc","def","ghl");//从左存储 7 jedis.rpush("list","abc","def","ghl");//从右存储 8 //获取 9 List<String> li = jedis.lrange("list",0,-1); 10 System.out.println(li); 11 //关闭连接 12 jedis.close(); 13 }
4、集合类型(set):set集合元素不可以重复r
sadd/smembers
1 @Test 2 public void test5(){ 3 //获取连接 4 Jedis jedis = new Jedis("127.0.0.1",6379); 5 //操作 6 jedis.sadd("set","java","php","python"); 7 //获取 8 Set<String> set = jedis.smembers("set"); 9 System.out.println(set); 10 //关闭连接 11 jedis.close(); 12 }
5、有序集合类型(sortedset):sortedset集合既不能让元素重复,元素存到集合中之后还会给元素排序
zadd/zrange start end
1 @Test 2 public void test6(){ 3 //获取连接 4 Jedis jedis = new Jedis("127.0.0.1",6379); 5 //操作 6 jedis.zadd("sortedset",7,"物理"); 7 jedis.zadd("sortedset",17,"化学"); 8 jedis.zadd("sortedset",2,"语文"); 9 //获取 10 Set<String> set = jedis.zrange("sortedset",0,-1); 11 System.out.println(set); 12 //关闭连接 13 jedis.close(); 14 }
jedis连接池:jedis自带了连接池(JedisPool)
1 @Test 2 public void test7(){ 3 //创建一个配置对象 4 JedisPoolConfig config = new JedisPoolConfig(); 5 config.setMaxTotal(50); 6 config.setMaxIdle(10); 7 //1.创建连接池 8 JedisPool jedisPool = new JedisPool(config,"127.0.0.1",6379); 9 //2.获取连接 10 Jedis jedis = jedisPool.getResource(); 11 //3.使用 12 jedis.set("book","litter"); 13 //4.连接归还到连接池 14 jedis.close(); 15 }
这里还可以将配置抽取出来作为一个工具类
1 public class JedisPoolUtil { 2 private static JedisPool jedisPool; 3 static { 4 //读取配置文件 5 InputStream is = JedisPoolUtil.class.getClassLoader().getResourceAsStream("jedis.properties"); 6 //创建properties对象 7 Properties properties = new Properties(); 8 //关联文件 9 try { 10 properties.load(is); 11 } catch (IOException e) { 12 e.printStackTrace(); 13 } 14 //获取数据,设置到JedisPoolConfig中 15 JedisPoolConfig config = new JedisPoolConfig(); 16 config.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle"))); 17 config.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal"))); 18 //初始化JedisPool 19 jedisPool = new JedisPool(config,properties.getProperty("host"),Integer.parseInt(properties.getProperty("port"))); 20 } 21 22 /** 23 * 获取连接方法 24 * @return 25 */ 26 public static Jedis getJedis(){ 27 return jedisPool.getResource(); 28 } 29 30 } 31 32 @Test 33 public void test8(){ 34 //1.通过连接池工具获取 35 Jedis jedis = JedisPoolUtil.getJedis(); 36 //2.使用 37 jedis.set("book","litter"); 38 //3.连接归还到连接池 39 jedis.close(); 40 }