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)

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>
序号命令及描述
1HDEL key field1[ [field2] 删除一个或多个哈希表字段
2HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
3HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。
4HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。
5HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment 。
6HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment
7HKEYS key 获取所有哈希表中的字段
8HLEN key 获取哈希表中字段的数量
9HMGET key field1 [field2]获取所有给定字段的值
10[HMSET key field1 value1 field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。
11HVALS 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
3BRPOPLPUSH source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
4RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
5LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素
6LSET key index value 通过索引设置列表元素的值
7LPOP key 移出并获取列表的第一个元素 这个移除没有时间限制
8RPOP key 移除并获取列表最后一个元素
9LREM 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>
序号命令及描述
1SPOP key 移除并返回集合中的一个随机元素
2SCARD 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 集合中
8SISMEMBER key member 判断 member 元素是否是集合 key 的成员
9SMOVE 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>
六. 其他常用命令
序号命令及描述
1SET key value 该命令用于设置key值
2DEL key该命令用于在 key 存在时删除 key。 删除成功则返回1
3EXISTS key 检查给定 key 是否存在。 若 key 存在返回 1 ,否则返回 0 。
4EXPIRE key seconds为给定 key 设置过期时间。 key 过期后将不可用,会自动删除。秒为单位
5EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
6PEXPIRE key milliseconds 设置 key 的过期时间以毫秒计。
7PEXPIREAT key milliseconds-timestamp 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
8KEYS pattern 查找所有符合给定模式( pattern)的 key 。和正则表达式类似
9MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中. select 0 redis默认使用数据库 0,也可以使用select db来切换数据库
10PERSIST key 移除 key 的过期时间,key 将持久保持。
11PTTL key 以毫秒为单位返回 key 的剩余的过期时间。
12TTL key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
13RANDOMKEY 从当前数据库中随机返回一个 key 。
14RENAME key newkey 修改 key 的名称
15RENAMENX key newkey 仅当 newkey 不存在时,将 key 改名为 newkey 。
16TYPE 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”错误

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值