Redis数据库
1、简单介绍Redis
1.1、概念
redis是c语言开发的,是基于内存(数据存储到内存中)的以键值对存储的非关系型数据库。
1.2、redis的特点
-
redis将数据存储到内存当中, redis的读写效率非常高: 读 11万/s 写 8万/s
-
redis中提供了丰富的数据类型: 五种 String hash list set sortedSet
-
注意: redis中数据类型指的是value的数据类型,而key只有String
-
redis支持快捷移植数据,
-
redis操作都是原子性的,用来保证数据的完整性
1.3、redis的数据类型的使用场景
-
String:
- 特点: 和java中String是类似的, 表示字符串
- get;set;mget;mset;setnx, getrange(截图字符串);strlen;incr ;decr;incrby;decryby
- 使用场景: 做缓存 计数器 点赞
-
hash:
- 特点: 和java中hashmap是类似的,
- hset;hget;hkeys,hlen,hdel,hgetAll
- 使用场景: 做缓存(一般可以被String所替代)
-
list:
- 特点: 和 java中linkedList类似,看做一个队列(FIFO)
- lpush,rpush,lrange,lpop,rpop,llen,lindex
- 使用场景: 模拟队列 栈 朋友圈点赞
-
set:
- 特点: 和java中set集合类型: 去重 无序
- sadd,smembers,spop,srandmember,sismember
- 使用场景: 去重操作 抽奖
-
sortedSet:
- 特点: 去重 有序
- zadd,zrange,zrevrange,zscore(查看元素的的分值),zrangebyscore,zrank,
- 使用场景: 排序(排行榜)
-
Keys的命令:
- del,exists,keys
2、Redis的安装
- 下载
Windows的下载路径:
https://github.com/microsoftarchive/redis/releases
https://github.com/MicrosoftArchive/redis/tags
官网下载(针对Linux的版本):
https://redis.io/download
Redis端口:6379
- 安装
具体安装步骤参考安装文档即可
https://www.runoob.com/redis/redis-install.html
3、使用Redis
3.1、打开redis
安装路径中双击redis-cli.exe
3.2、具体使用
可参考中文官网
http://redis.cn/
3.3、Redis的持久化机制
-
默认情况下Redis的持久化机制是一直打开的
-
Redis在断电的时候,把所有的数据生成一个快照,并将其保存到本地磁盘中去,在下次启动的时候,会首先读取快照数据,并恢复到内存空间
4、在java代码中操作Redis数据库
4.1、Jedis:Redis 的客户端工具
jedis就是一款java连接redis的客户端工具, jedis中操作API与redis中命令是一样的,大大降低了学习成本,jedis也是redis官方推荐的一款java客户端工具
4.2、Jedis的使用
- 首先需要导入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
- 测试类
所有对Redis数据库的操作,和官网文档中提供的操作方式一致。
public class App {
@Test
public void test1() throws Exception{
/*
使用Jedis客户端工具连接数据库
两个参数:主机地址,端口号
*/
Jedis jedis = new Jedis("localhost",6379);
jedis.set("mykey","myValue");
System.out.println(jedis.get("mykey"));
jedis.close();
}
}
4.3、Jedis连接池
在没次使用Redis时都需要建立连接用完之后释放资源,这样会浪费资源,所以可以设置Redis连连接池。
//工具类
public class JedisUtils {
private static JedisPool jedisPool;
//静态代码块:
static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(20); // 最大的闲时连接
config.setMinIdle(5); // 最小的闲时连接
jedisPool = new JedisPool(config,"192.168.72.144",6379);
}
//获取连接
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
5、补充内容
5.1、数据爬取去重(Jedis通常使用场景)
在上面爬取数据过程中,若需要按时爬取非重复信息可以使用Jedis中的set集合以达到去重的目的。
Long aaa = jedis.sadd(STORE_SPIDER_NEWS, newUrl);
5.2、按时自动爬取(xml)
- 导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
- applicationContext.xml配置文件
<bean id="myTask" class="com.ujiuye.springtask.MyTask"/>
<!--配置定时任务-->
<task:scheduled-tasks>
<!--一个定时任务-->
<task:scheduled ref="myTask" method="execute" cron="*/2 * * * * ?"/>
</task:scheduled-tasks>
- java类
//测试方法
public class App {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
context.start();
}
}
//执行方法
public class MyTask {
public void execute(){
System.out.println("方法执行了");
}
}
5.3、按时自动爬取(注解)
- 导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
- applicationContext.xml配置文件
<context:component-scan base-package="com.ujiuye"/>
<task:annotation-driven/>
- java类
//测试方法
public class App {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
context.start();
}
}
//执行方法
@Component
public class MyTask {
@Scheduled(cron = "*/1 * * * * ?")
public void execute(){
System.out.println("方法执行了");
}
}
5.4、介绍cron表达式
(cron = “*/1 * * * * * *”)按顺序依次为(星期一般用"?",年一般不写)
-
秒(0~59)
-
分钟(0~59)
-
小时(0~23)
-
天(0~31)每个月的第几天
-
月(0~11)每年的第几月
-
星期(1~7 1为SUN-依次为SUN,MON,TUE,WED,THU,FRI,SAT)
-
年份(1970-2099)
-
"?"表示不设置值,只能出现在每个月的第几天和每周的第几天,防止冲突,但是两者只能出现一个