追枫狼

导航

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   }

 

 

 

posted on 2019-05-21 21:07  追枫狼  阅读(263)  评论(0编辑  收藏  举报