Redis入门基础教程

Redis启动

一. 启动本地的Redis客户端:

打开终端CMD, 进入Redis的安装目录, 输入命令redis-cli,该命令会连接本地的 redis 服务。

C:\Users\Chen Xiuhong>cd D:\Redis

C:\Users\Chen Xiuhong>D:

D:\Redis>redis-cli
127.0.0.1:6379> echo "hello world"
"hello world"
127.0.0.1:6379>

二. 启动远程的Redis服务

redis-cli -h host -p port -a password

以下实例演示了如何连接到主机为 172.20.0.58,端口为 6379 ,无密码 的 redis 服务上。

D:\Redis>redis-cli -h 172.20.0.58 -p 6379
172.20.0.58:6379> echo "hello world"
"hello world"
172.20.0.58:6379>ping   ---查看服务是否运行
PONG

Redis的数据类型

Redis的五种数据类型: string hash list set zset ( 有序集合)

一. String

SET key value / GET key

GETRANGE key start end —-返回 key 中字符串值的子字符

string类型是Redis最基本的数据类型,一个键最大能存储512MB。下边是一些详细的关于string的命令

redis 127.0.0.1:6379> SET name "Chen"
OK
redis 127.0.0.1:6379> GET name
"Chen"
1)append key value

如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作。

127.0.0.1:6379> append user_id 1
(integer) 1
127.0.0.1:6379> get user_id
"1"
127.0.0.1:6379> append user_id 2
(integer) 2
127.0.0.1:6379> get user_id
"12"
127.0.0.1:6379>

返回值: 整数. 返回append后字符串的长度. (exists key 查询是否存在该key, 若不存在则显示0,存在则显示1)

扫描二维码关注公众号,回复: 1583211 查看本文章
127.0.0.1:6379> exists user_name
(integer) 0
127.0.0.1:6379> append user_name zhangSan
(integer) 8
127.0.0.1:6379> append user_name Men
(integer) 11
127.0.0.1:6379> get user_name
"zhangSanMen"
127.0.0.1:6379> exists user_name
(integer) 1
127.0.0.1:6379>
2)strlen key

返回key的string类型value的长度或者0(key不存在)。如果key对应的非string类型,就返回错误。

127.0.0.1:6379> strlen user_name
(integer) 11
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> strlen age
(integer) 2
127.0.0.1:6379> strlen gendor
(integer) 0
127.0.0.1:6379>
3)getrange key start end

这个命令是被改成GETRANGE的,在小于2.0的Redis版本中叫SUBSTR。 返回key对应的字符串value的子串,这个子串是由start和end位移决定的(两者都在string内)。可以用负的位移来表示从string尾部开始数的下标。所以-1就是最后一个字符,-2就是倒数第二个,以此类推。

这个函数处理超出范围的请求时,都把结果限制在string内。

127.0.0.1:6379> get user_name
"zhangSanMen"
127.0.0.1:6379> getrange 0 5
(error) ERR wrong number of arguments for 'getrange' command
127.0.0.1:6379> getrange user_name 0 5
"zhangS"
127.0.0.1:6379> getrange user_name 0 -1
"zhangSanMen"
127.0.0.1:6379> getrange user_name 0 -2
"zhangSanMe"
127.0.0.1:6379>
4)bitcount key start end

统计字符串被设置为1的bit数,( 即字符串转换为二进制,所包含的1的个数) 通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。start 和 end 参数的设置和 GETRANGE 命令类似,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推。

不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。

127.0.0.1:6379> bitcount user_name
(integer) 46
127.0.0.1:6379> get user_name
"zhangSanMen"

127.0.0.1:6379> bitcount user_name 0 0
(integer) 5
127.0.0.1:6379> bitcount user_name 1 1
(integer) 3
127.0.0.1:6379> bitcount user_name 0 2
(integer) 11
5)decr/incr key

对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0, 然后执行减1命令,所以下边的score是-1。

127.0.0.1:6379> get age
"18"
127.0.0.1:6379> decr age
(integer) 17
127.0.0.1:6379> decr score
(integer) -1
127.0.0.1:6379> get score
"-1"
127.0.0.1:6379> incr age
(integer) 18
6)decrby/incrby key decrement

对key对应的数字减decrement操作. 如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。

127.0.0.1:6379> get age
"17"
127.0.0.1:6379> decrby age 3
(integer) 14
127.0.0.1:6379>

127.0.0.1:6379> decr user_name
(error) ERR value is not an integer or out of range
127.0.0.1:6379> get user_name
"zhangSanMen"
127.0.0.1:6379>
7)getset key value

自动将key设置到value 并且返回原来key对应的value。如果key存在但是对应的value不是字符串,就返回错误。返回之前的旧值,如果之前Key不存在将返回nil

如下: 年龄age最开始是15, 使用getset命令之后返回的是15即之前的value, 再次get之后就是30

127.0.0.1:6379> get age
"15"
127.0.0.1:6379> getset age 30
"15"
127.0.0.1:6379> get age
"30"
127.0.0.1:6379> get class
(nil)

实例:计数器

Redis的原子递增操作最常用的使用场景是计数器。

使用思路是:每次有相关操作的时候,就向Redis服务器发送一个incr命令。

例如这样一个场景:我们有一个web应用,我们想记录每个用户每天访问这个网站的次数。

web应用只需要通过拼接用户id和代表当前时间的字符串作为key,每次用户访问这个页面的时候对这个key执行一下incr命令。

这个场景可以有很多种扩展方法:

  • 通过结合使用INCREXPIRE命令,可以实现一个只记录用户在指定间隔时间内的访问次数的计数器
  • 客户端可以通过GETSET命令获取当前计数器的值并且重置为0
  • 通过类似于DECR或者INCRBY等原子递增/递减的命令,可以根据用户的操作来增加或者减少某些值 比如在线游戏,需要对用户的游戏分数进行实时控制,分数可能增加也可能减少。

二 . Hash

HMSET hash名称 字段1名称 字段1值 [字段2名称 字段2值 ….]

HGET hash名称 字段1名称 —-获得hash中的某个字段名称

HGETALL hash名称 —–获得hash中的所有字段名称

Redis hash 是一个键值(key=>value)对集合。(和java中的hashMap类似,是键值对)

Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

127.0.0.1:6379> HMSET myHash field1 "value1" field2 "value2"
OK
127.0.0.1:6379> HGET myHash field1
"value1"
127.0.0.1:6379> HGET myHash field2
"value2"
127.0.0.1:6379> HGETALL myHash
1) "field1"
2) "value1"
3) "field2"
4) "value2"
127.0.0.1:6379>
序号 命令及描述
1 HDEL key field1[ [field2] 删除一个或多个哈希表字段
2 HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
3 HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。
4 HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。
5 HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment 。
6 HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment
7 HKEYS key 获取所有哈希表中的字段
8 HLEN key 获取哈希表中字段的数量
9 HMGET key field1 [field2]获取所有给定字段的值
10 [HMSET key field1 value1 field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。
11 HVALS key 获取哈希表中所有值

三. List

LPUSH list名称 value —-从list的左边插入数据

RPUSH list名称 value —-从list的右边插入数据

LRANGE list名称 start end —-获得list数据, end= -1 表示list的最后一条数据, -2表示倒数第二条数据

LLEN list名称 —-获得list的size

LINDEX list名称 index —- 获得list的第index个元素

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

127.0.0.1:6379> LPUSH myList "name1"
(integer) 1
127.0.0.1:6379> LPUSH myList "name2"
(integer) 2
127.0.0.1:6379> LPUSH myList "name3"
(integer) 3
127.0.0.1:6379> RPUSH myList "name-1"
(integer) 4
127.0.0.1:6379> LRANGE myList 0 -1
1) "name3"
2) "name2"
3) "name1"
4) "name-1"
127.0.0.1:6379> LLEN myList
(integer) 4
127.0.0.1:6379> LINDEX myList 2
"name1"
序号 命令及描述
1 [BLPOP key1 key2 ] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
image.png
2 [BRPOP key1 key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
image.png
3 BRPOPLPUSH source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
4 RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
5 LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素
6 LSET key index value 通过索引设置列表元素的值
7 LPOP key 移出并获取列表的第一个元素 这个移除没有时间限制
8 RPOP key 移除并获取列表最后一个元素
9 LREM key count value 移除列表元素

四.Set

Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

Set和java中的set类似,存储不重复的数据,添加一个string元素到key对应的set集合中,成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误。

SADD set名称 元素1 [元素2 元素3….] —-在set中添加一个元素

SMEMBERS set名称 —-获得set中的所有数据

关于Set的相关命令可以参考此网址:http://www.redis.cn/commands/sadd.html

127.0.0.1:6379> sadd mySet fieldA
(integer) 1
127.0.0.1:6379> sadd mySet fieldB
(integer) 1
127.0.0.1:6379> sadd mySet fieldC
(integer) 1
127.0.0.1:6379> sadd mySet fieldC
(integer) 0
127.0.0.1:6379> smembers mySet
1) "fieldC"
2) "fieldB"
3) "fieldA"
127.0.0.1:6379>
序号 命令及描述
1 SPOP key 移除并返回集合中的一个随机元素
2 SCARD key 获取集合的成员数
3 [SDIFF key1 key2] 返回给定所有集合的差集
4 [SDIFFSTORE destination key1 key2] 返回给定所有集合的差集并存储在 destination 中
5 [SINTER key1 key2] 返回给定所有集合的交集
6 [SINTERSTORE destination key1 key2] 返回给定所有集合的交集并存储在 destination 中
7 [SUNIONSTORE destination key1 key2] 所有给定集合的并集存储在 destination 集合中
8 SISMEMBER key member 判断 member 元素是否是集合 key 的成员
9 SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合
10 [SUNION key1 key2] 返回所有给定集合的并集
11 [SRANDMEMBER key count] 返回集合中一个或多个随机数
12 [SREM key member1 member2] 移除集合中一个或多个成员

五. zset 有序集合

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

ZADD key score member —-添加元素到集合,元素在集合中存在则更新对应score

ZRANGEBYSCORE key min max [WITHSCORES][LIMIT offset count]

返回key的有序集合中的分数在min和max之间的所有元素(包括分数等于max或者min的元素)。元素被认为是从低分到高分排序的。如果M是常量(比如,用limit总是请求前10个元素),你可以认为是O(log(N))。

默认情况下,区间的取值使用闭区间(小于等于或大于等于),你也可以通过给参数前增加’ ( ’ 符号来使用可选的开区间(小于或大于)。

关于ZSET详见: http://www.redis.cn/commands/zrangebyscore.html

127.0.0.1:6379> zadd myZset 1 mem1
(integer) 1
127.0.0.1:6379> zadd myZset 3 mem3
(integer) 1
127.0.0.1:6379> zadd myZset 2 mem2
(integer) 1

127.0.0.1:6379> zrangebyscore myZset 0 -1
(empty list or set)
127.0.0.1:6379> zrangebyscore myZset 0 10
1) "mem1"
2) "mem2"
3) "mem3"

-- 取2>= score >= 0 的数据
127.0.0.1:6379> zrangebyscore myZset 0 2
1) "mem1"
2) "mem2"

-- 取2> score >= 0 的数据
127.0.0.1:6379> zrangebyscore myZset 0 (2
1) "mem1"
127.0.0.1:6379>

六. 其他常用命令

序号 命令及描述
1 SET key value 该命令用于设置key值
2 DEL key该命令用于在 key 存在时删除 key。 删除成功则返回1
3 EXISTS key 检查给定 key 是否存在。 若 key 存在返回 1 ,否则返回 0 。
4 EXPIRE key seconds为给定 key 设置过期时间。 key 过期后将不可用,会自动删除。秒为单位
5 EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
6 PEXPIRE key milliseconds 设置 key 的过期时间以毫秒计。
7 PEXPIREAT key milliseconds-timestamp 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
8 KEYS pattern 查找所有符合给定模式( pattern)的 key 。和正则表达式类似
9 MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中. select 0 redis默认使用数据库 0,也可以使用select db来切换数据库
10 PERSIST key 移除 key 的过期时间,key 将持久保持。
11 PTTL key 以毫秒为单位返回 key 的剩余的过期时间。
12 TTL key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
13 RANDOMKEY 从当前数据库中随机返回一个 key 。
14 RENAME key newkey 修改 key 的名称
15 RENAMENX key newkey 仅当 newkey 不存在时,将 key 改名为 newkey 。
16 TYPE key 返回 key 所储存的值的类型。

Redis HyperLogLog

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

PFADD key element [element …] 添加指定元素到 HyperLogLog 中

PFCOUNT key [key …] 返回给定 HyperLogLog 的基数估算值。

PFMERGE destKey sourceKey [sourceKey …] 将多个 HyperLogLog 合并为一个 HyperLogLog

image.png

Redis发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

Redis 客户端可以订阅任意数量的频道。当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

订阅频道 :

SUBSCRIBE chanel [ chanel2 …..] 订阅一个或多个频道

PSUBSCRIBE patternChanel [ …..] 订阅一个或者多个符合正则表达式的频道

127.0.0.1:6379> subscribe chanel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "chanel1"
3) (integer) 1

发布消息:

PUBLISH chanel message 将消息发布到指定的频道

重新开启个 redis 客户端,然后在同一个频道 chanel1发布两次消息,订阅者就能接收到消息。每发布一次消息,订阅者就能同步接收到新发布的消息.

image.png

查看订阅与发布系统状态

PUBSUB CHANNELS : 显示系统中存在的频道名称

如果一个cmd中输入ctrl+c就会退出订阅模式,再次查询订阅系统会显示没有chanel.

127.0.0.1:6379> pubsub channels
1) "chanel1"
127.0.0.1:6379> pubsub chanel1
(error) ERR Unknown PUBSUB subcommand or wrong number of arguments for 'chanel1'

退定频道:

PUNSUBSCRIBE [pattern [pattern …]] : 退订所有给定模式的频道

UNSUBSCRIBE channel [channel …] : 退订给定的一个或多个频道的信息

Redis事务

事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。一个事务从开始到执行会经历以下三个阶段, Redis中先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:

  • 开始事务。

  • 命令入队。

  • 执行事务。

    image.png

Redis脚本

Redis 脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL

调用执行脚本:

$ redis-cli –eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] …

或者EVAL script numkeys KEYS[1] KEYS[2] , ARGV[1] ARGV[2] …

  • –eval,告诉redis-cli读取并运行后面的lua脚本

  • path/to/redis.lua,是lua脚本的位置

  • KEYS[1] KEYS[2],是要操作的键,可以指定多个,在lua脚本中通过KEYS[1], KEYS[2]获取

  • ARGV[1] ARGV[2],参数,在lua脚本中通过ARGV[1], ARGV[2]获取。

    注意: KEYS和ARGV中间的 ‘,’ 两边的空格,不能省略。

    127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
    1) "key1"
    2) "key2"
    3) "first"
    4) "second"

脚本中的KEYS[i]一定要大写,否则会报错, 认为keys不是全局变量.

如下: set key1 arg2 设置string字符串的值

127.0.0.1:6379> eval "return redis.call('set',keys[1] , argv[1])" 1 key1 arg2
(error) ERR Error running script (call to f_e2cc5740711db75c81e39cb0b3cefa668a52c7a2): @enable_strict_lua:15: user_script:1: Script attempted to access unexisting global variable 'keys'
127.0.0.1:6379> eval "return redis.call('set',KEYS[1] , ARGV[1])" 1 key1 arg2
OK
127.0.0.1:6379> get key1
"arg2"
127.0.0.1:6379>

终止脚本:

SCRIPT KILL: 强制终止当前脚本的执行。 但是,如果当前执行的脚步对redis的数据进行了写操作,则SCRIPT KILL命令不会终止脚本的运行,以防止脚本只执行了一部分。脚本中的所有命令,要么都执行,要么都不执行。

注意:

Redis的脚本执行是原子的,即脚本执行期间Redis不会执行其他命令。所有的命令都必须等待脚本执行完成后才能执行。为了防止某个脚本执行时间过长导致Redis无法提供服务(比如陷入死循环),Redis提供了lua-time-limit参数限制脚本的最长运行时间,默认为5秒钟。当脚本运行时间超过这一限制后,Redis将开始接受其他命令但不会执行(以确保脚本的原子性,因为此时脚本并没有被终止),而是会返回“BUSY”错误

猜你喜欢

转载自blog.csdn.net/a1786223749/article/details/78898935