1 概念
- redis 是一个开源的,一款高性能的NoSQL系列的非关系型数据库,它可以用作数据库、缓存和消息中间件。
1.1 什么是NoSQL
- NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。泛指非关系型的数据库。
- 随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
1.2 NoSQL和关系型数据库比较
- 1) 使用成本
NoSQL:NoSQL 使用简单,易搭建,大部分是开源软件,比较廉价。
关系型数据库:相对于NoSQL,关系型数据库通常需要安装部署,开源的比较少,使用成本比较昂贵。 - 2) 存储形式
NoSQL:NoSQL 具有丰富的存储形式,如 key-value(键值对)形式、图结构形式、文档形式、列簇形式等,因此,它可以存储各种类型的数据。
关系型数据库:它是行列表结构,它=采用二维表结构的形式对数据进行持久存储。 - 3) 查询速度
NoSQL:NoSQL 将数据存储在系统的缓存中,不需要经过 SQL 层的解析,因此查询效率很高。
关系型数据库:关系型数据库将数据存储在系统的硬盘中,在查询的时候需要经过 SQL 层的解析,然后读入内存,实现查询,因此查询效率较低。 - 4) 扩展性
NoSQL:NoSQL 去掉了传统关系型数据库表与字段之间的关系,实现了真正意义上的扩展。它采用键值对的形式存储数据,消除了数据之间的耦合性,因此易扩展。
关系型数据库:数据与数据之间的关联性较强,存在耦合性,不易扩展。尤其是存在多表连接(join)查询机制的限制,使得扩展很难实现。 - 5) 是否支持 ACID 特性
NoSQL:NoSQL 一般不支持 ACID 特性,它实现最终一致性。
关系型数据库:关系型数据库支持 ACID 特性,具有严格的数据一致性。 - 6) 是否支持 SQL 语句
NoSQL:SQL 语句在 NoSQL 中是不被支持的,NoSQL 没有声明性查询语言,且没有预定义的模式。
关系型数据库:关系型数据库支持 SQL 语句,也支持复杂查询。SQL 是结构化查询语言、数据操纵语言、数据定义语言。
关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库。
1.3 主流的NoSQL产品
NoSQL产品详见:https://baike.baidu.com/item/NoSQL#2
1.4 redis的特点及优势
- 性能极高 – Redis读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
1.5 redis的应用场景
- 高性能适合当做缓存(数据查询、新闻内容、商品内容等)
- 应用排行榜
- 网站访问统计
- 数据过期处理(可以精确到毫秒)
- 分布式集群架构中的session分离
- 分布式锁
2 下载及安装
下载及安装详见:
3 常见的命令操作
3.1 数据结构
redis存储的是:key-value格式的数据,其中key都是字符串,value支持五种数据类型:string(字符串),hash(哈希),list(列表,支持重复元素),set(集合,不允许重复元素)及zset(sorted set:不允许重复元素的有序集合)。
3.2 字符串(String)
- 存储
127.0.0.1:6379> set usrname liuyh
OK
- 获取
127.0.0.1:6379> get usrname
"liuyh"
- 删除
127.0.0.1:6379> del usrname
(integer) 1
3.3 哈希(Hash)
- 存储
hset key field value:将哈希表 key 中的字段 field 的值设为 value 。
127.0.0.1:6379> hset information usrname liuyh
(integer) 1
127.0.0.1:6379> hset information age 20
(integer) 1
- 获取
hget key field:获取存储在哈希表中指定字段的值。
127.0.0.1:6379> hget information usrname
"liuyh"
hgetall key:获取在哈希表中指定 key 的所有字段和值
127.0.0.1:6379> hgetall information
1) "usrname"
2) "liuyh"
3) "age"
4) "20"
- 删除
hdel key field1 [field2]:删除一个或多个哈希表字段
127.0.0.1:6379> hdel information age
(integer) 1
3.4 列表(List)
- 添加
lpush key value: 将元素加入列表左表
rpush key value:将元素加入列表右边
127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> rpush list 2
(integer) 2
127.0.0.1:6379> rpush list 3
(integer) 3
- 获取
lrange key start end :获取列表指定范围内的元素
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "2"
3) "3"
- 删除
lpop key: 删除列表最左边的元素,并将元素返回
rpop key: 删除列表最右边的元素,并将元素返回
127.0.0.1:6379> lpop list
"1"
127.0.0.1:6379> rpop list
"3"
3.5 集合(Set)
- 存储
sadd key value1 [value2]:向集合添加一个或多个成员
127.0.0.1:6379> sadd set a
(integer) 1
127.0.0.1:6379> sadd set b
(integer) 1
- 获取
smembers key:获取set集合中所有元素
127.0.0.1:6379> smembers set
1) "b"
2) "a"
- 删除
srem key value1 [value2]:移除set集合中一个或多个成员
127.0.0.1:6379> srem set b
(integer) 1
3.6 有序集合(sorted set)
- 存储
zadd key score1 value1 [score2 value2]:向有序集合添加一个或多个成员,或者更新已存在成员的分数
127.0.0.1:6379> zadd sortset 80 apple 60 orange
(integer) 2
- 获取
zrange key start stop [withscores]:通过索引区间返回有序集合指定区间内的成员
127.0.0.1:6379> zrange sortset 0 -1
1) "orange"
2) "apple"
127.0.0.1:6379> zrange sortset 0 -1 withscores
1) "orange"
2) "60"
3) "apple"
4) "80"
- 删除
zrem key value [value …]:移除有序集合中的一个或多个成员
127.0.0.1:6379> zrem sortset apple
(integer) 1
3.7 常用命令
- keys *: 查询所有的键
- type key:返回 key所储存的值的类型
- del key [key …] :删除给定的一个或多个 key 。不存在的 key 会被忽略
- exists key [key …] :判断可以是否存在,存在返回1,多个累加计数。
- redis-server redis.conf:启动redis服务
- redis-cli -p 6379:使用redis客户端连接
- shutdown:关闭redis服务
- info replication:主/从复制信息
- ps -ef | grep redis-server:可以查看 redis进程,以及可以查看到安装路径等信息
- select dbIndex:默认16个数据库:0-15,进入redis后默认是0库。不建议使用多个数据库
- flushdb / flushall:用于清除数据库,flushdb只清除当前数据库,flushall清除所有数据库。
- ping:测试与服务器的连接,如果正常则返回pong
- auth password:登录redis时输入密码
- slaveof host port: 将当前服务器转变为指定服务器的从属服务器
- multi:标记一个事务块的开始
- discard:取消执行事务块内的所有命令
- exec:执行事务块内的命令
- unwatch:取消watch命令对所有key的监视
- watch key [key …]:监视一个或者多个key,如果事务执行之前,这个kye被其它命令所动,则事务被打断
以上介绍的是基本的redis操作命令,复杂命令详见:https://www.runoob.com/redis/redis-commands.html
4 持久化
redis是一个内存数据库,当redis服务器重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
- RDB:默认方式,默认就使用这种机制
在一定的间隔时间中,检测key的变化情况,然后持久化数据。在配置文件redis.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
- AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
# appendonly no(关闭aof) --> appendonly yes (开启aof)
appendonly yes
# appendfsync always : 每一次操作都进行持久化
appendfsync everysec : 每隔一秒进行一次持久化
# appendfsync no : 不进行持久化
redis持久化机制详细描述参考:
https://www.javazhiyin.com/42207.html
5 Java客户端 Jedis
- 下载jedis的jar包
- 使用
//1. 获取连接
Jedis jedis = new Jedis("localhost",6379);
//2. 操作
jedis.set("username","zhangsan");
//3. 关闭连接
jedis.close();