redis是一款高性能的NOSQL系列非关系型数据库
什么是NOSQL
NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,这是一项全新的数据库理念,泛指非关系型数据库。
NoSQL 这个词同时还有一种接地气的解释方式为 “没有SQL”,因为其为非关系型的数据库,所以并不支持统一的SQL查询标准(结构化查询语言),其不采用SQL进行数据处理,而是拥有自己独立的处理API
NOSQL发展的时代背景
随着互联网web2.0网站的逐步兴起,传统的关系数据库在对应web2.0网站已经显得招架不住,暴露了很多问题,而非关系型的数据库则由于其本身速度非常快的特点得到了蓬勃的发展。
NoSQL数据库的出现是为了解决大规模数据集合和多重数据种类带来的挑战,尤其是大数据应用方向的难题。
NOSQL和关系型数据库比较
优点:
缺点:
非关系型数据库的优势:
关系型数据库的优势:
总结
主流的NOSQL产品如下:
Redis是一个用C语言开发的开源的高性能键值对(key-value)数据库,经官方提供的测试数据,由50个并发执行100000个请求,其读的速度是110000次/s,而写的速度是81000次/s,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
redis的应用场景
补上两个链接:
Redis官网
Redis中文网
首先在redis中文网的安装教程中,有提供三种安装方式,分别是
但是这里的版本都比较低,不太建议下载
这里最高是只有到2.4x的版本
这里推荐一个地址,版本比较新一点:
https://github.com/microsoftarchive/redis/releases
页面如下:
找到你想下载的版本,点击进去直接下载,文件是很小的,因为咱们这边是windows下使用,直接就下载了zip,绿色版直接解压使用
解压后目录文件如下:
可以把没用的东西都删一下,整理之后目录为:
其中主要我们会用到的是以下三个文件:
redis.windows.conf:配置文件
redis-cli.exe:redis的客户端
redis-server.exe:redis服务器端
双击redis-server.exe(redis服务器端) ,出现如下界面:端口号是6379
不要关闭此界面,关闭此界面等于关闭了redis服务器。
再双击点开**redis-cli.exe(客户端)**即可,在客户端的控制台上就可以开始操作redis了。
上边有提到过redis的五种数据结构类型:
其分别有对应的独立命令来操作,在我们的redis中文网上就有其相关教程:
示例如下:
中文网上会有比较完整的命令总结和点击进去的示例命令,因为这里对应得命令内容较多,这里我们暂且对一些简单的必须掌握的内容进行一个简单的使用示例以及总结,具体其他的命令有空了可以再自己学习掌握:
简单操作一下:
4. 集合类型 set : 不允许重复元素
① 添加: sadd key value
② 获取: smembers key 获取set集合中所有元素
③ 删除: srem key value 删除set集合中的某个元素
简单操作一下:
5. 有序集合类型 sortedset:不允许重复元素,且元素有顺序
每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
① 添加: zadd key score value
② 获取: zrange key start end 加上[withscores]参数可以将对应分数一起打印出来
③ 删除: zrem key value
redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
redis已经为我们提供了两种持久化机制:
RDB:默认方式,不需要进行配置,默认就使用这种机制
也称之为快照模式,在某一段时间后会进行一次持久化,这个持久化触发条件是我们在配置文件中自己设置的,由于这种持久化方式的粒度可能比较大,是可能会出现数据丢失的情况的。
* 在一定的间隔时间中,检测key的变化情况,然后持久化数据
1. 编辑redis.windwos.conf文件
# after 900 sec (15 min) if at least 1 key changed
save 900 1
# after 300 sec (5 min) if at least 10 keys changed
save 300 10
# after 60 sec if at least 10000 keys changed
save 60 10000
2. 重新启动redis服务器,并指定配置文件名称
D:\...\redis\windows-64\redis>redis-server.exe redis.windows.conf
我们打开并且编辑配置文件:
找到 SNAPSHOTTING ,就是快照的意思
我们加上一句 save 10 1,意思就是
在十秒中至少有一个键值被修改的时候会触发持久化,注意这里查询是不会触发持久化的,我们来启动一下服务
进入你的redis-server所在的文件夹,shift + 鼠标右键,点击在此处打开命令窗口,我们使用带配置文件的启动方式:redis-server.exe redis.windows.conf
笔者这里启动有报错:Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
据查询可能是客户端没有成功退出的原因,解决方案如下:
解决 Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
后来启动成功:
一波操作之后会出现一个 .rdb的文件
这里你再重启服务后之前存储的键值就会一直存在于你的内存数据中,直到你将其删除,这里需要注意的就是快照的频率,也就是其触发条件。
第二种持久化方法:
- 编辑redis.windwos.conf文件
appendonly no(关闭aof) --> appendonly yes (开启aof)
# appendfsync always : 每一次操作都进行持久化
appendfsync everysec : 每隔一秒进行一次持久化
# appendfsync no : 不进行持久化
这里我们找到 附加模式 APPEND ONLY MODE
选择开启aof
appendonly yes (开启aof)
稍微下划一点,找到对应aof的持久化粒度设置,我们可以发现aof的持久化粒度是很小的,很精细,但是也是非常消耗资源的,看业务数据如何取舍了。
这里我们依旧用带配置文件参数的方式启动redis,并且随便做一做键值的设定添加和修改
这里启动之后就直接生成了 .aof 文件,就是存储命令记录的文件,因为我们没有操作所以大小为0,我们随便做几个操作:
就可以发现其大小发生了改变,我们关闭服务端再打开,看一看键值还在不在
么得问题。
Jedis: 一款java操作redis数据库的工具,下载jedis的jar包后即可使用。
简单举例:
public class JedisTest {
@Test
public void test() {
// 获取连接
Jedis jedis = new Jedis("localhost", 6379);
// 操作
/**
* String类型操作
* 添加,修改:set
* 获取(单个):get
* 删除:del
*/
jedis.set("name", "zhangsan");
String name = jedis.get("name");
jedis.del("name");
// 设置带失效时间的key-value
jedis.setex("code", 20, "cfl777");
/**
* hash类型操作
* 添加,删除:hset
* 获取(单个):hget
* 删除:hdel
* 获取(全部):hgetall
*/
jedis.hset("person", "name", "cfl");
jedis.hset("person", "age", "23");
String hget = jedis.hget("person", "name");
Map<String, String> person = jedis.hgetAll("person");
jedis.hdel("person", "name");
/**
* list类型操作
* 添加:lpush,rpush
* 获取(范围):lrange start end
* 删除:rpop,lpop
*/
jedis.lpush("list", "aaa");
jedis.lpush("list", "bbb");
jedis.rpush("list", "ccc");
List<String> list = jedis.lrange("list", 0, -1);
String lpop = jedis.lpop("list");
String rpop = jedis.rpop("list");
/**
* set类型操作 不允许重复元素
* 添加:sadd
* 获取(全部):smembers
* 删除:srem
*/
jedis.sadd("myset", "aaa", "bbb");
Set<String> myset = jedis.smembers("myset");
jedis.srem("myset", "aaa");
/**
* sortedSet 带排序(得分)的set → ztree → z
* 添加:zadd
* 获取(范围):zrange
* 删除:zrem
* 可选项:withscores,表示元素值得同时表示出其得分(排序)
*/
jedis.zadd("zset", 3, "aaa");
jedis.zadd("zset", 1, "bbb");
jedis.zadd("zset", 2, "ccc");
Set<String> zset = jedis.zrange("zset", 0, -1);
Set<Tuple> zset1 = jedis.zrangeWithScores("zset", 0, -1);
jedis.zrem("zset", "bbb");
/**
* 通用方法
*/
// 通过正则获取匹配到的key
Set<String> keys = jedis.keys("*");
// 直接删除对应key的元素
jedis.del("key");
// 获取此key对应的元素值类型
String type = jedis.type("key");
// 关闭连接
jedis.close();
}
}
以及Jedis自己提供的连接池:
public class JedisPoolTest {
public static void main(String[] args) {
// 创建连接池配置文件
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(50);
// ...
// 创建连接池
JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379);
// 获取连接
Jedis jedis = jedisPool.getResource();
// 使用...
// 关闭连接,归还至连接池
jedis.close();
}
}
这里想提一下Lettuce,虽然和Jedis一样,他们都是Java对redis操作命令的封装,但是Lettuce获得了Spring生态的认可,被集成到spring-data-redis驱动中,必有其过人之处,笔者这里只有简单的了解了一点,所以这里附上一个之前看过的觉得讲的很好的一个链接,一起学习,共勉:
Redis高级客户端Lettuce详解