一、Redis简介
-
Redis是一款高性能的Nosql非关系型数据库,以key : value形式把数据缓存在内存中,同时也具有持久化的机制(持久化指的是它不仅可以把数据存在内存中,还可以把数据持久化的存在硬盘里)。
- Nosql:Not only sql,意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。同系列的产品还有Mongodb、CouchDB等等
-
格式:key:value
二、Redis应用
-
为什么使用Redis
-
成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
-
查询速度:MySQL是把数据存储在硬盘中,然而查询数据对于硬盘的读取效率不是很高,耗时。nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
-
存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
-
扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
-
三、Redis数据结构
- Redis是以key --> value格式,key是字符串类型,value有5种不同类型。
- value的五种类型
字符串类型 | string |
---|---|
哈希类型 | hash |
列表类型 | list |
集合类型 | set |
有序集合类型 | sortedset |
四、Redis持久化机制
当我们的服务器关机,或者是Redis服务关闭,内存中的数据可能会丢失,这时就需要一个持久化的机制,来永久的储存我们的数据。
Redis持久化机制有两种方式:
-
RDB(默认):以在一段时间内,key发生变更的次数,集中的去处理一下
- 配置redis.conf文件:save 秒数 key变动次数(例: save 500 1 就是指在500秒内我们的key有一个发生变化,就会帮我们进行一下存储)
-
AOF:redis.conf文件 appendonly (no/yes)(默认为no)
-
-
appendfsync always 每一次都操作都持久化
-
appendfsync everysec 每秒持久化一次
-
appendfsync no 不持久化
-
五、Jedis入门
1.入门操作
-
Jedis:java操作redis的工具。
-
使用方式:Redis的端口号默认为6379
//连接redis
Jedis jedis = new Jedis("127.0.0.1",6379);
//操作redis
jedis.set("username","zhangsan");
//关闭连接
jedis.close();
-
需要Maven坐标
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency>
@Test
public void test1(){
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.set("name","zhansgan");
jedis.close();
}
@Test
public void test2(){
Jedis jedis = new Jedis("127.0.0.1",6379);
String name = jedis.get("name");
System.out.println(name);
jedis.close();
}
这样zhangsan就被取了出来。
2.Jedis操作各种redis中的数据结构
(1) 字符串类型 string
set get
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
jedis.set("username","zhangsan");
//获取
String username = jedis.get("username");
System.out.println(username);
//可以使用setex()方法存储可以指定过期时间的 key value
jedis.setex("activecode",20,"hehe");//将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对,适合于类似手机验证码场景下的操作
//3. 关闭连接
jedis.close();
(2) 哈希类型 hash : map格式
hset hget hgetAll
Jedis jedis = new Jedis();
// 存储hash
jedis.hset("user","name","lisi"); //("key","field","value")
jedis.hset("user","age","23");
jedis.hset("user","gender","female");
// 获取hash
String name = jedis.hget("user", "name");
System.out.println(name);
// 获取hash的所有map中的数据
Map<String, String> user = jedis.hgetAll("user");
// keyset
Set<String> keySet = user.keySet();
for (String key : keySet) {
//获取value
String value = user.get(key);
System.out.println(key + ":" + value);
}
jedis.close();
(3) 列表类型 list:linkedlist格式,支持重复元素
lpush | rpush
lpop | rpop
lrange start end : 范围获取
Jedis jedis = new Jedis();
// list 存储
jedis.lpush("mylist","a","b","c");//从左边存,cba
jedis.rpush("mylist","a","b","c");//从右边存,abc
// list 范围获取
List<String> mylist = jedis.lrange("mylist", 0, -1); //-1表示最后一个,也就是取出所有数据
System.out.println(mylist);
// list 弹出
String element1 = jedis.lpop("mylist");
System.out.println(element1);//弹出c
String element2 = jedis.rpop("mylist");
System.out.println(element2);//弹出c
// list 范围获取
List<String> mylist2 = jedis.lrange("mylist", 0, -1);
System.out.println(mylist2);
jedis.close();
(4) 集合类型 set:不允许重复元素
sadd
smembers:获取所有元素
Jedis jedis = new Jedis();
// set 存储
jedis.sadd("myset","java","php","c++");
// set 获取
Set<String> myset = jedis.smembers("myset");
System.out.println(myset);
jedis.close();
(5) 有序集合类型 sortedset:不允许重复元素,且元素有顺序
zadd
zrange
Jedis jedis = new Jedis();
// sortedset 存储
jedis.zadd("mysortedset",3,"亚瑟");
jedis.zadd("mysortedset",30,"后裔");
jedis.zadd("mysortedset",55,"孙悟空");
// sortedset 获取
Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);
System.out.println(mysortedset);
jedis.close();