“Redis:常用命令”的版本间差异
(→5种数据类型) |
(→发布和订阅) |
||
第323行: | 第323行: | ||
== 发布和订阅 == | == 发布和订阅 == | ||
发布订阅是'''消息队列'''的一种方式,基于消息队列的方式,可以实现系统解耦、削峰填谷,顶住流量洪峰; | |||
* redis的主业目前是基于键值对的数据存储、缓存等,消息队列可能是redis的一种尝试; | |||
* 常用的流行的消息队列有:“'''ActiveMQ'''”、“'''RabbitMQ'''”等; | |||
=== 什么是发布订阅 === | |||
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(publish)发送消息,订阅者(subscribe)接收消息。 | |||
* 发布订阅也叫“'''生产者消费者'''”模式,是实现“'''消息队列'''”的一种方式; | |||
* 消息队列的三要素: | |||
*# 生产者(producer) | |||
*# 消费者(consumer) | |||
*# 消息服务(broker) | |||
*:[[File:redis发布和订阅关系图.png|400px]] | |||
发布: | |||
:[[File:redis发布.png|400px]] | |||
订阅: | |||
:[[File:reids订阅.png|400px]] | |||
=== 如何实现 === | |||
(以命令行模拟实现) | |||
# 开启4个redis客户端(“./redis-cli”),如上图,3个客户端作为消息订阅者,1个为消息发布者: | |||
# 让3个消息订阅者订阅某个频道主题:“subscribe channelTest”;(命令:“'''subscribe''' channel [channel ...]”) | |||
#: [[File:redis订阅channelTest.jpg|800px]] | |||
# 让1个消息发布者向频道主题上发布消息:“publish channelTest message123”;(命令“'''publish''' channel message”) | |||
#: [[File:redis发布消息到channelTest.jpg|800px]] | |||
* 如果是订阅匹配模式的频道主题:“psubscribe chan*”(表示匹配以chan开头的频道主题,命令“ '''psubscribe''' pattern [pattern ...]”); | |||
*: 订阅: | |||
*:[[File:redis订阅(psubscribe).jpg|800px]] | |||
*: 发布: | |||
*:[[File:redis发布(psubscribe).jpg|800px]] | |||
== 事务 == | == 事务 == |
2020年10月28日 (三) 00:31的版本
关于Redis
Remote Dictionary Server(Redis) 是一个开源的由Salvatore Sanfilippo使用ANSI C语言编写的key-value数据存储服务器。其值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型,所以它通常也被称为数据结构服务器。
- redis属于NoSQL数据库,NoSQL数据库叫非关系型数据库,(NoSQL = Not Only SQL),意即"不仅仅是SQL"。
- 数据库类型:
- key-value存储:“Berkeley DB”、“MemcacheDB”、“Redis”
- 文档存储:“MongoDB”、“CouchDB”
- 列存储:“Hbase”、“Cassandra”
redis的特点:
- redis足够简单和稳定
- 支持丰富的数据结构
- 内存存储读写性能优秀
- 提供持久化的支持
- 支持部分事务操作
下载安装
- 官网:“https://redis.io/”
- 下载:
- 安装:
- 解压:tar -zxvf redis-3.2.9.tar.gz
- 切换目录: cd redis-3.2.9,执行命令:make
- 将 src下的可执行文件复制到/usr/local/bin 目录下,再执行 make install
- 启动:(切换到 redis-3.2.9/src/ 目录执行命令)
- 后台启动:“./redis-server & ”
- 后台启动并输出日志到nohup.out文件:“nohup /usr/local/redis-3.2.9/src/redis-server &”
- 关闭:(结束进程:kill pid 或者 kill -9 pid)
- 切换到 redis-3.2.9/src/ 目录执行:“./redis-cli shutdown”
客户端
redis命令行客户端:
- redis-cli(Redis Command Line Interface)是Redis自带的基于命令行的Redis客户端,用于与服务端交互,我们可以使用该客户端来执行redis的各种命令。
- 直接连接redis (默认ip127.0.0.1,端口6379):“./redis-cli”
- 指定IP和端口连接redis:“./redis-cli -h 127.0.0.1 -p 6379”
redis远程客户端:
- Redis Desktop Manager
- 官网:https://redisdesktop.com/
- 远程连接redis需要修改redis主目录下的“redis.conf”配置文件:
- “bind ip”绑定ip注释掉;
- “protected-mode yes”保护模式改为no;
- phpRedisAdmin
- (需要本地安装php运行环境)
redis编程客户端(Java):(类似于数据库驱动)使用它提供的API就能访问服务器上的redis并对它进行各种操作。
- Jedis,redis的Java编程客户端,Redis官方首选推荐使用Jedis,jedis是一个很小但很健全的redis的java客户端
- jedis完全兼容redis 2.8.x and 3.x.x
- Jedis源码:https://github.com/xetorthio/jedis
- api文档:http://xetorthio.github.io/jedis/
- Lettuce:可伸缩线程安全的Redis客户端。多个线程可以共享同一个“RedisConnection”。它利用优秀netty NIO框架来高效地管理多个连接。
- redis的其他编程语言客户端:C、C++、C#、Erlang、Lua、Objective-C、Perl、PHP、Python、Ruby、Scala、Go,等40多种语言都有连接redis的编程客户端;
Redis基础
- “redis.conf”是Redis的配置文件;
- redis默认为16个库(默认自动使用0号库);
redis手册:
- redis英文版命令大全:“https://redis.io/commands”
- redis中文版命令大全:“http://redisdoc.com/”
基础命令:
- 验证安装:(redis-cli等链接后)输入“ping”(redis返回“PONG”表示服务运行正常);
- 切换库命令:“select <db>”;
- 删除所有库的数据:“flushall”;
- 删除当前库的数据:“flushdb”;
- 获得redis的所有配置值:“config get *”;
- redis-cli退出当前redis连接:“exit”或“quit”;
- 查看当前数据库中key的数目:“dbsize”;
- 查看redis服务器的统计信息:“info”;
1 + 5 命令:
- 1种key操作:“key”命令,redis以key-value存储数据,所有的操作均为对key的操作:
命令 | 说明 |
---|---|
keys * | 列出所有的key |
exists <key> | 检查某个key是否存在 |
move <key> db | 将当前库的key移动到给定的库db中,比如:move k1 2 |
expire <key> seconds | 设置key的值的过期时间 |
ttl <key> | ttl(time to live)查看key还有多少秒过期,-1永不过期,-2已过期或key不存在 |
type <key> | 查看key所储存的值的类型 |
del <key> | 删除key |
- 5种数据类型操作:
数据类型 | 说明 |
---|---|
string | 字符串类型 |
hash | 哈希类型 |
list | 列表类型 |
set | 集合类型 |
zset(sorted set) | 有序集合类型 |
Java操作redis
- jedis的jar包依赖Maven配置:(jedis也依赖“Apache Commons Pool 2 2.0”)
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
- 使用jedis:
public static void main(String[] args) { //连接Redis服务器 Jedis jedis = new Jedis("192.168.1.103", 6379); //查看服务是否运行正常 System.out.println("服务正在运行: " + jedis.ping()); }
5种数据类型
string
字符串类型:字符串类型是Redis中最基本的数据类型;
- 它能存储任何形式的字符串,包括二进制数据,序列化后的数据,JSON化的对象甚至是一张图片。
命令 | 说明 |
---|---|
set <key> <value> | 将字符串值 value 设置到 key 中; |
get <key> | 获取 key 中设置的字符串值; |
incr <key> | 将 key 中储存的数字值加1;
|
decr <key> | 将 key 中储存的数字值减1;
|
setex <key> <seconds> <value> | “set expire”的简写,设置key的值 ,并将 key 的生存时间设为 seconds (以秒为单位) ; |
setnx <key> <value> | setnx 是“set if not exists”的简写,如果key不存在,则设置值,存在则不设置值; |
getset <key> <value> | 设置 key 的值为 value ,并返回 key 的旧值; |
strlen <key> | 返回 key 所储存的字符串值的长度; |
append <key> <value> | 如果 key 存在且是字符串, 则将 value 追加到 key 原来旧值的末尾;
|
incrby <key> <increment> | 将 key 所储存的值加上增量值;
|
decrby <key> <decrement> | 将 key 所储存的值减去减量值;
|
getrange <key> <start> <end> | 获取 key 中字符串值从 start 开始 到 end 结束 的子字符串; |
setrange <key> <offset> <value> | 从指定的位置开始将key的值替换为新的字符串; |
mset <key> <value> [<key> <value>] | 同时设置一个或多个 key-value 对 |
mget <key> [<key>] | 获取所有(一个或多个)给定 key 的值 |
msetnx <key> <value> [<key> <value>] | 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在时才能设置成功,否则只要有一个key存在都会失败 |
hash
哈希类型:是一个string类型的field和value的映射表;
- hash特别适合用于存储对象。
(命令前加了“h”,对“key”及“field(域)”和“value”操作)
命令 | 说明 |
---|---|
hset <key> <field> <value> | 将哈希表 key 中的域 field 的值设为 value |
hget <key> <field> 获取哈希表 key 中给定域 field 的值 | |
hmset <key> <field> <value> [<field> <value>] | 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
hmget <key> <field> [<field>] | 获取哈希表 key 中一个或多个给定域的值 |
hgetall <key> | 获取哈希表 key 中所有的域和值 |
hdel <key> <field> [<field>] | 删除哈希表 key 中的一个或多个指定域field |
hkeys <key> | 查看哈希表 key 中的所有field域 |
hvals <key> | 查看哈希表 key 中所有域的值 |
hlen <key> | 获取哈希表 key 中域field的个数 |
hexists <key> <field> | 查看哈希表 key 中,给定域 field 是否存在 |
hincrby <key> <field> <increment> | 为哈希表 key 中的域 field 的值加上增量 increment |
hincrbyfloat <key> <field> <increment> | 为哈希表 key 中的域 field 加上浮点数增量 increment |
hsetnx <key> <field> <value> | 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在的时候才设置,否则不设置 |
list
列表类型:简单的字符串列表,按照插入顺序排序。
- 可以添加一个元素导列表的头部(左边)或者尾部(右边);【???】
(命令前加了“l”,,对“key”和“value”操作,对元素进行类似于队列的操作)
命令 | 说明 |
---|---|
lpush <key> <value> [<value>] | 将一个或多个值 value 插入到列表 key 的表头(最左边) |
rpush <key> <value> [<value>] | 将一个或多个值 value 插入到列表 key 的表尾(最右边) |
lrange <key> <start> <stop> | 获取列表 key 中指定区间内的元素
|
lpop <key> | 从左边获取列表 key 的一个元素,并将该元素移除 |
rpop <key> | 从右边获取列表 key 的一个元素,并将该元素移除 |
lindex <key> <index> | 获取列表 key 中下标为指定 index 的元素 |
llen <key> | 获取列表 key 的长度 |
lrem <key> <count> <value> | 从左到右删除列表中指定个数的“与指定value值相等的”value |
ltrim <key> <start> <stop> | 删除指定区域外的元素,比如LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除 |
rpoplpush <source> <destination> | “RPOPLPUSH source destination”将列表 source 中的最后一个元素(尾元素)弹出插入到列表 destination ,作为 destination 列表的的头元素 |
lset <key> <index> <value> | 将列表 key 下标为 index 的元素的值设置为 value |
linsert <key> BEFORE|AFTER <pivot> <value> | 将值 value 插入到列表 key 当中位于值 pivot 之前或之后的位置 |
set
集合类型:string类型的无序集合,集合成员是唯一的,即集合中不能出现重复的数据;
(命令前加了“s”,对“key”和“member”操作)
命令 | 说明 |
---|---|
sadd <key> <member> [<member>] | 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将不会再加入 |
smembers <key> | 获取集合 key 中的所有成员元素 |
sismember <key> <member> | 判断 member 元素是否是集合 key 的成员 |
scard <key> | 获取集合里面的元素个数 |
srem <key> <member> [<member>] | 删除集合 key 中的一个或多个 member 元素 |
srandmember <key> [count] | 随机返回集合中的一个元素【???】 |
spop <key> [count] | 随机从集合中删除一个元素 |
smove <source> <destination> <member> | 将 member 元素从一个集合移动到另一个集合 |
zset(sorted set)
有序集合类型:(有序的set)不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。
(命令前加了“z”,对“key”及“member”和“score”操作)
命令 | 说明 |
---|---|
XX] [CH] [INCR] <score> <member> [<score> <member>] | 将一个或多个 member 元素及其 score 值加入到有序集合 key 中 |
zrem <key> <member> [<member>] | 删除有序集合 key 中的一个或多个成员 |
zcard <key> | 获取有序集 key 的元素成员的个数 |
zrank <key> <member> | 获取有序集 key 中成员 member 的排名,有序集成员按 score 值从小到大顺序排列 |
zrevrank <key> <member> | 获取有序集 key 中成员 member 的排名,有序集成员按 score 值从大到小顺序排列 |
zrangebyscore <key> <min> <max> [WITHSCORES] [LIMIT offset count] | 获取有序集 key 中,所有 score 值介于 min 和 max 之间的成员【有啥区别】 |
zrevrangebyscore <key> <min> <max> [WITHSCORES] [LIMIT offset count] | 获取有序集 key 中, score 值介于 max 和 min 之间的所有的成员【有啥区别】 |
zcount <key> <min> <max> | 获取有序集 key 中,所有 score 值介于 min 和 max 之间的成员的个数 |
zrange <key> <start> <stop> [WITHSCORES] | 获取有序集 key 中,指定区间内的成员,按 score 值从小到大排列【?】 |
zrevrange <key> <start> <stop> [WITHSCORES] | 获取有序集 key 中,指定区间内的成员,按 score 值从大到小排列【?】 |
发布和订阅
发布订阅是消息队列的一种方式,基于消息队列的方式,可以实现系统解耦、削峰填谷,顶住流量洪峰;
- redis的主业目前是基于键值对的数据存储、缓存等,消息队列可能是redis的一种尝试;
- 常用的流行的消息队列有:“ActiveMQ”、“RabbitMQ”等;
什么是发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(publish)发送消息,订阅者(subscribe)接收消息。
发布:
订阅:
如何实现
(以命令行模拟实现)
- 开启4个redis客户端(“./redis-cli”),如上图,3个客户端作为消息订阅者,1个为消息发布者:
- 让3个消息订阅者订阅某个频道主题:“subscribe channelTest”;(命令:“subscribe channel [channel ...]”)
- 让1个消息发布者向频道主题上发布消息:“publish channelTest message123”;(命令“publish channel message”)