Redis概述
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value(Nosql)数据库,并提供多种语言的API,它可以用作数据库、缓存和消息中间件。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
Nosql
NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
Redis的优势
- 性能极高: Redis读的速度是110000次/s,写的速度是81000次/s。
- 丰富的数据类型:Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- 持久化:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- 原子性操作: Redis的所有操作都是原子性的,要么成功执行要么失败完全不执行。
- 除此之外,Redis还支持集群、分布式、主从同步等配置
Redis在java web中的应用
Redis 在 Java Web 主要有两个应用场景:
- 存储 缓存 用的数据;
- 需要高速读/写的场合使用它快速读/写;
缓存
在日常数据库操作中,读写的占比大概在9:1到7:3之间,使用读操作的次数远超写操作,每次读取数据都到数据库查询太慢了,而且会给数据库带来较大的负担,这时就需要缓存了。在初次查询数据时,将数据存储到缓存中,这样之后的查询就可以直接在缓存中读取,效率大大提升。
Redis的数据类型
String
字符串类型是redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。你可以用它存储用户的邮箱、json化的对象甚至是图片。一个字符类型键允许存储的最大容量是512M。
Hash
hash 类型很像一个关系型数据库的数据表,hash 的 Key 是一个唯一值,Value 部分是一个 hashmap 的结构。
应用场景:存放对象。
List
按插入顺序排序的双向链表,类似java中的linkedList。
应用场景:任务队列。
Set
无序、不重复的集合,类似java中的hashSet。
应用场景:共同好友列表(两个set取交集、并集)
sorted Set(zset)
有序集合,在set的基础上为每一个元素增加了一个score。
应用场景:排行榜、成绩单、热点新闻。
scan命令
SCAN cursor [MATCH pattern] [COUNT count]
生产环境中,redis可能存储了大量的key,此时使用keys或smembers等命令一次性的查出所有key,会导致redis服务器阻塞数秒,为了避免这个情况,redis提供了带分页的scan命令(scan命令用于所有key,hscan、sscan、zscan则针对相应的数据类型)。
基本用法
scan 0开始一次新的迭代,redis会返回两个数据,第一个是游标参数(cursor),第二个是扫描到的数据列表。
接下来使用第一次迭代返回的游标参数进行迭代,如下面代码中的scan 17.
当游标参数为0时,表明迭代结束。
可以在scan 游标参数后面
redis 127.0.0.1:6379> scan 0
1) "17"
2) 1) "key:12"
2) "key:8"
3) "key:4"
4) "key:14"
5) "key:16"
6) "key:17"
7) "key:15"
8) "key:10"
9) "key:3"
10) "key:7"
11) "key:1"
redis 127.0.0.1:6379> scan 17
1) "0"
2) 1) "key:5"
2) "key:18"
3) "key:0"
4) "key:2"
5) "key:19"
6) "key:13"
7) "key:6"
8) "key:9"
9) "key:11"
COUNT参数
scan命令不保证每次返回的数据数量,不过可以通过COUNT参数设置返回数据的最大值。另外,并非每次迭代都要使用相同的 COUNT 值。
MATCH参数
可以筛选数据只返回匹配的数据,注意这个匹配操作是在迭代后进行的,也就是说可能会出现每次只能返回少量数据甚至没有数据的情况。