什么是Redis?
官方文档解释:Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes with radius queries and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
翻译:Redis是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,如字符串,散列,列表,集合,带有范围查询的排序集,位图,超级日志,具有半径查询和流的地理空间索引。Redis具有内置复制,Lua脚本,LRU回收,事务和不同级别的磁盘持久性,同时通过Redis Sentinel提供高可用性,通过Redis Cluster提供自动分区。
redis官网 redis中文网
特点
- Redis基于内存,并支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
应用场景
Redis可以在很多场景下使用,如缓存-热数据、计数器、消息队列、排行榜、秒杀系统、验证码、分布式锁等等具体场景。
Redis安装与验证
mac系统直接使用brew install redis
安装即可(需先安装Homebrew
),环境变量Homebrew
会自动配置,Redis配置文件redis.conf
存放在/usr/local/ect/redis.conf
。如果是windows系统请使用虚拟机安装Linux在安装Redis,具体请参考Redis中文官网安装教程
启动 Redis
$redis-server
查看 redis 是否启动:
$redis-cli
以上命令将打开以下终端:
redis 127.0.0.1:6379>
127.0.0.1 是本机 IP ,6379 是 redis 服务端口。现在我们输入 PING 命令。
redis 127.0.0.1:6379> ping
PONG
以上说明我们已经成功安装了redis。
Redis配置文件
Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf,我们可以修改该文件内容进行自定义配置,之后需要根据该配置文件启动Redis,此处只介绍几个常用的配置:
-
bind 127.0.0.1 ::1
:默认情况下该配置只能接受本机的访问请求,不写的情况下,无限制接受任何ip地址的访问(测试阶段使用#注释掉即可),生产环境请写你应用服务器的地址。如果开启了protected-mode
且没有设置密码,则Redis只接受本机访问。 -
protected-mode yes
:保护模式,开启时需要设置bind ip或者密码。关闭时外部ip可以直接访问。 -
port 6379
:Redis服务端口号 -
daemonize no
:Redis默认不是以守护进程(不会常驻后台)的方式运行,可以通过该配置项修改,使用yes
启用守护进程(常驻后台) -
tcp-backlog 511
:等待最大队列数,此处设置无效,默认为128,需要修改另一处配置文件 -
timeout 0
:一个空闲的客户端维持多少秒会关闭,0为永不关闭 -
tcp-keepalive 300
:对访问客户端的心跳检测,每隔300秒检测一次 -
pidfile
:当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
Redis基本命令
Redis命令大小写均可,可是作为中国人,总觉得大写有点变扭,无法像看简体繁体一样直接理解其意,所以个人习惯使用小写。下面为基本的Redis命令:
-
redis-server [redis.conf]
:开启Redis服务器(可选择以指定配置启动) -
redis-cli
:启动客户端连接本地Redis服务器 -
redis-cli -h
:启动客户端连接远程Redis服务器(指定服务器IP端口和密码)-p -a -
ping
:连接服务器后使用该命令用于检测 redis 服务是否启动(返回PONG
) -
select
:选择某个库 -
keys *
:查询当前库的所有键,*
可以使用其他通配符代替。 -
exitsts
:判断某个键是否存在 -
type
:判断键的类型 -
del
:删除某个键 -
expire
:为键值设置过期(删除)时间,单位秒 -
ttl
:查看还有多少秒过期,-1表示永不过期,-2表示已过期 -
dbsize
:查看当前数据库的key的数量 -
flushdb
:清空当前库 -
flushall
:通杀全部库
Redis的数据类型
Redis支持的数据类型可以分为五大类:String类型、List类型、Set(无序集合)类型、Sorted Set(有序集合)类型、Hash类型,Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于它们创建了一个对象系统,这些系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象,下面为具体介绍:
String类型
String是Redis最基本的类型,一个key对应一个value,该类型是二进制安全的,所以可以包含任何数据,比如jpg图片或者序列化的对象;一个Redis中字符串value最多可以是512M,下面为该类型命令:
get
:获取指定键的值set
:设置键与值append
:追加指定值到原值末尾strlen
:获取键的长度setnx
:设置完键值后不可被覆盖incr
:将key中存储的数字值加1,只能对数字值操作decr
:将key中存储的数字值减1,只能对数字值操作incrby/decrby
:将key中存储的数字加/减指定步长<步长> mset
:同时设置多个键值对mget
:同时获取多个键值对msetnx
:同时设置多个键值对,不可被覆盖get range
:获得值的范围,类似java的substring<起始位置> <结束位置> setrange
:从起始位置以<起始位置> value value
值代替setex
:设置键值的同时,设置过期时间,单位秒<过期时间> psetex
:这个命令和<过期时间> setex
命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像setex
命令那样,以秒为单位。getset
:以新换旧,设置新值同时获得新值
List类型
单键多值,Redis列表(List)是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边);它的底层是双向链表
,对两端的操作性能很高,通过索引下标的操作中间的节点性能会变差;一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
-
lpush/rpush
:从左边/右边插入一个或多个值到列表头部 -
lpop/rpop
:从左边/右边吐出一个值,值在键在,值空键亡 -
rpoplpush
:从列表右边吐出一个值,插到 列表右边 -
lrange
:按照索引下标获得元素(从左到右) -
lindex
:按照索引下标获得元素(从左到右) -
llen
:获得列表长度 -
linsert
:在指定列表的指定值前面或后面插入新值before/after -
lrem
:删除n个value(可以有多个相同的value,n为正数代表从左边删除,负数则从右边,0代表删除所有 )
Set类型
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
-
sadd
:向集合添加一个或多个成员,重复成员将被省略 -
smembers
:查看集合中的所有成员 -
sismember
:判断member元素是否为集合中的内容,有返回1,无返回0 -
scard
:返回该集合的个数 -
srem
:删除集合中的成员,可同时删除多个 -
spop
:随机吐出集合中的一个成员并显示 -
srandmember
:随机从该集合中取出n个值,不会从集合中删除 -
sinter
:返回两个集合的交集 -
sunion
:返回两个集合的并集 -
sdiff
:返回两个集合的差集,集合先后顺序不同结果不同
Sorted Set类型(有序集合)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数(score)
。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
-
zadd
:向有序集合按分数添加一个或多个成员,或者更新已存在成员的分数 -
zrange key
:通过索引区间返回有序集合成指定区间内的成员(可选显示分数)[withscores] -
zrangebyscore key min max [withscores]
:通过分数从小到大返回有序集合指定区间内的成员 -
zrevrangebyscore key max min [withscores]
:通过分数从大到小返回有序集合指定区间内的成员 -
zincrby
:有序集合中对指定成员的分数加上增量 increment -
zrem
:移除有序集合中的一个或多个成员 -
zcount
:计算在有序集合中指定区间分数的成员数 -
zrank
:返回有序集合中指定成员的索引排名
Hash类型
Redis hash 是一个string类型的field和value的映射表,类似于Java里面的Map
-
hset key
:将哈希表 key 中的字段 field 的值设为 value -
hget key
:获取存储在哈希表中指定字段的值 -
hmset key
:同时将多个 field-value (域-值)对设置到哈希表 key 中 -
hexists key
>:查看哈希表key中,给定field是否存在 -
hkeys
:列出该哈希表中所有的field -
hincrby
:为哈希表key中的field的值加上增量 -
hsetnx
:为哈希表key追加一个field字段,其值设置为value,仅当field不存在时
Java客户端Jedis连接Redis服务器
要想通过Java连接Redis,需要使用Jedis包,Jedis所需的jar包为Jedis.jar
,请去maven仓库自行下载你想要的jar版本,当我们通过maven构建项目之后,加入上述包的依赖即可,下面为测试代码:
import ...
public class JedisTest {
Jedis jedis = new Jedis("127.0.0.1",6379);
@Before
public void before(){
jedis.select(6);
jedis.flushDB();
}
@Test
public void test1(){
jedis.zadd("user",200.0,"jack");
Map map = new HashMap<>();
map.put("tom",100.0);
map.put("lucy",400.0);
map.put("william",300.0);
jedis.zadd("username",map);
}
}
此处和当前主机的6379端口连接(因为mac系统自带终端,如果是windows系统请输入虚拟机中服务器IP地址,且需要先将防火墙关闭,修改redis.conf
配置文件:注释bing 127.0.0.1
,protected-mode
改为 no
,daemonize
改为yes
,然后通过reds-server /usr/local/etc/redis.conf
启动Redis服务器)。当我们执行测试时,先执行@Before
里语句,即选择了索引为6的库,之后清空了该库所有数据。当我们执行test1
测试,会往有序集合加入分数为200的成员jack
,后续我们创建一个Map集合加入相应数据,在将该集合加入有序集合username
中,我们可以直接在Redis服务器查看到添加的数据:
127.0.0.1:6379[6]]> zrange username 0 -1 withscores
1) "tom"
2) "100"
3) "william"
4) "300"
5) "lucy"
6) "400"