1.Redis介绍
1.1 Redis 简介
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
1.2 Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
1.3 Redis与其他key-value存储有什么不同?
- Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
- Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
2.Redis安装和配置
略
3.Redis常用命令
3.1 Redis 客户端连接服务器
# 连接远程服务器语法
$ redis-cli -h host -p port -a password
# 连接本机无密码redis服务器示例 并使用ping命令检测服务器是否启动
alpine1:/home/gitlab/etc# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> ping
PONG
3.2 Redis 键(key)
Redis 键命令用于管理 redis 的键。
# Redis 键命令基本语法
redis 127.0.0.1:6379> COMMAND KEY_NAME
# 删除key,如果键被删除成功,命令执行后输出 (integer) 1,否则将输出 (integer) 0
127.0.0.1:6379> del key
(integer) 1
# 检查给定 key 是否存在。
127.0.0.1:6379> exists key
(integer) 1
127.0.0.1:6379> exists noexistkey
(integer) 0
# 为给定 key 设置过期时间,以秒计。
127.0.0.1:6379> expire key 100
(integer) 1
# 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
127.0.0.1:6379> ttl key
(integer) 44
# 设置 key 的过期时间以毫秒计。
127.0.0.1:6379> pexpire key 1000000
(integer) 1
# 以毫秒为单位返回 key 的剩余的过期时间。
127.0.0.1:6379> pttl key
(integer) 994201
# 移除 key 的过期时间,key 将持久保持。
127.0.0.1:6379> persist key
(integer) 1
127.0.0.1:6379> ttl key
(integer) -1
# 查找所有符合给定模式( pattern)的 key 。
127.0.0.1:6379> keys *
1) "key"
2) "key1"
# 修改 key 的名称
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> rename key1 key2
OK
127.0.0.1:6379> get key2
"hello"
# 仅当 newkey 不存在时,将 key 改名为 newkey 。
127.0.0.1:6379> renamenx key2 key
(integer) 0
127.0.0.1:6379> renamenx key2 key3
(integer) 1
# 查看key 所储存的值的类型。
127.0.0.1:6379> type key
string
3.3 Redis 字符串命令
# 设置指定 key 的值。
127.0.0.1:6379> set key helloworld
OK
# 获取指定 key 的值。
127.0.0.1:6379> get key
"helloworld"
# 将 key 中储存的数字值增一。
127.0.0.1:6379> set number 100
OK
127.0.0.1:6379> incr number
(integer) 101
# 将 key 所储存的值加上给定的增量值(increment) 。
127.0.0.1:6379> incrby number 101
(integer) 202
# 将 key 中储存的数字值减一。
127.0.0.1:6379> decr number
(integer) 201
# key 所储存的值减去给定的减量值(decrement) 。
127.0.0.1:6379> decrby number 100
(integer) 101
# 指定的 value 追加到该 key 原来值(value)的末尾。
127.0.0.1:6379> set appendstr hello
OK
127.0.0.1:6379> append appendstr world
(integer) 10
127.0.0.1:6379> get appendstr
"helloworld"
# 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
127.0.0.1:6379> setex key seconds value
3.4 Redis 哈希(Hash)命令
- Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
- 类似java中的HashMap
- Redis 中每个 hash 可以存储 $2^32$ - 1 键值对(40多亿)。
# 批量设置hash对象的属性
# 语法 hmset key field value [field value ...]
127.0.0.1:6379> hmset person name zhangsan age 22 school caus
OK
# 获取在哈希表中指定 key 的所有字段和值
127.0.0.1:6379> hgetall person
1) "name"
2) "zhangsan"
3) "age"
4) "22"
5) "school"
6) "caus"
# 将哈希表 key 中的字段 field 的值设为 value 。
# 语法 hset key field value
127.0.0.1:6379> hset person girlfirend xiaohong
(integer) 1
127.0.0.1:6379> hgetall person
1) "name"
2) "zhangsan"
3) "age"
4) "22"
5) "school"
6) "caus"
7) "girlfirend"
8) "xiaohong"
# 删除一个或多个哈希表字段
# 语法 hdel key field [field ...]
127.0.0.1:6379> hdel person girlfirend
(integer) 1
127.0.0.1:6379> hgetall person
1) "name"
2) "zhangsan"
3) "age"
4) "22"
5) "school"
6) "caus"
# 获取存储在哈希表中指定字段的值。
# 语法 hget key field
127.0.0.1:6379> hmget person name
1) "zhangsan"
3.5 Redis 列表(List)命令
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
# 将一个或多个值插入到列表头部
# 语法 lpush key value [value ...]
127.0.0.1:6379> lpush list a b c d
(integer) 4
# 查看列表指定区间元素、查看列表全部元素
# 语法 lrange key start stop
127.0.0.1:6379> lrange list 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange list 0 2
1) "d"
2) "c"
# 通过索引获取列表中的元素
# 语法 lindex key index
127.0.0.1:6379> lindex list 2
"b"
# 获取列表长度
127.0.0.1:6379> llen list
(integer) 4
# 移出并获取列表的第一个元素
127.0.0.1:6379> lpop list
"d"
# 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
# 语法 ltrim key start stop
127.0.0.1:6379> ltrim list 0 1
OK
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "b"
# 在列表中添加一个或多个值到列表尾部
# 语法 rpush key value [value ...]
127.0.0.1:6379> rpush list e f i g h i j k
(integer) 10
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "b"
3) "e"
4) "f"
5) "i"
6) "g"
7) "h"
8) "i"
9) "j"
10) "k"
# 移除列表的最后一个元素,返回值为移除的元素。
127.0.0.1:6379> rpop list
"k"
3.6 Redis 集合(Set)命令
- Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
- 集合对象的编码可以是 intset 或者 hashtable。
- Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
# 向集合添加一个或多个成员
# 语法 sadd key member [member ...]
127.0.0.1:6379> sadd myset hello world
(integer) 2
# 查看集合所有元素
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3.7 Redis 有序集合(sorted set)命令
- Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
- 不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
- 有序集合的成员是唯一的,但分数(score)却可以重复。
# 向有序集合添加一个或多个成员,或者更新已存在成员的分数
# 语法 zadd key score1 member1 [score2 member2]
127.0.0.1:6379> zadd sortedset 80 xiaoming 90 xiaohong 66 zhangsan
(integer) 3
# 通过索引区间返回有序集合指定区间内的成员
# 语法 zrange key start stop [WITHSCORES]
127.0.0.1:6379> zrange sortedset 0 100 WITHSCORES
1) "zhangsan"
2) "66"
3) "xiaoming"
4) "80"
5) "xiaohong"
6) "90"
127.0.0.1:6379> zrange sortedset 0 100
1) "zhangsan"
2) "xiaoming"
3) "xiaohong"
# 计算在有序集合中指定区间分数的成员数
# 语法 zcount key min max
127.0.0.1:6379> zcount sortedset 80 90
(integer) 2
# 有序集合中对指定成员的分数加上增量 increment
# 语法 zincrby key increment member
127.0.0.1:6379> zincrby sortedset 10 zhangsan
"76"
# 移除有序集合中的一个或多个成员
# 语法 zrem key member [member ...]
127.0.0.1:6379> zrem sortedset xiaoming
(integer) 1
127.0.0.1:6379> zrange sortedset 0 100 WITHSCORES
1) "zhangsan"
2) "76"
3) "xiaohong"
4) "90"
4.Redis 发布订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client3 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
# 订阅给定的一个或多个频道的信息。
# 语法 subscribe channel [channel ...]
# 将信息发送到指定的频道。
# publish channel message
- 示例
# 第一个客户端--订阅者
127.0.0.1:6379> subscribe jupizhe
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "jupiter"
3) (integer) 1
1) "message"
2) "jupiter"
3) "hello, welcom to subscribe"
1) "message"
2) "jupiter"
3) "who are you"
# 第二个客户端--发布者
127.0.0.1:6379> publish jupiter "who are you"
(integer) 1
5.Redis Stream
6.Java maven项目使用 Redis
6.1 pom.xml
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency
6.2 连接到 redis 服务
@Test
void testRedisConnect(){
//连接 Redis 服务
Jedis jedis = new Jedis("172.31.126.219");
// 如果 Redis 服务设置了密码,需要下面这行,没有就不需要
// jedis.auth("123456");
System.out.println("连接成功");
//查看服务是否运行
System.out.println("服务正在运行: "+jedis.ping());
}
连接成功
服务正在运行: PONG
6.3 Redis Java String(字符串) 实例
@Test
void testRedisString() throws InterruptedException {
//连接 Redis 服务
Jedis jedis = new Jedis("172.31.126.219");
// 如果 Redis 服务设置了密码,需要下面这行,没有就不需要
// jedis.auth("123456");
System.out.println("连接成功");
//设置 redis 字符串数据
jedis.setex("verifycode",300,"387432");
// 获取存储的数据并输出
System.out.println("redis 存储的字符串为: "+ jedis.get("verifycode"));
Thread.sleep(3000);
System.out.println("redis 存储的字符串有效期为: "+ jedis.ttl("verifycode")+" 秒");
}
连接成功
redis 存储的字符串为: 387432
redis 存储的字符串有效期为: 297 秒
6.4 Redis Java List(列表) 实例
@Test
void testRedisList() {
//连接Redis 服务
Jedis jedis = new Jedis("172.31.126.219");
// 如果 Redis 服务设置了密码,需要下面这行,没有就不需要
// jedis.auth("123456");
System.out.println("连接成功");
//存储数据到列表中
jedis.lpush("site-list", "JinDong");
jedis.lpush("site-list", "Google");
jedis.lpush("site-list", "Taobao");
// 获取存储的数据并输出
List<String> list = jedis.lrange("site-list", 0 ,2);
for(int i=0; i<list.size(); i++) {
System.out.println("列表项为: "+list.get(i));
}
连接成功
列表项为: Taobao
列表项为: Google
列表项为: JinDong
- 其他调用参考redis常用命令
评论 (0)