目录
计数:incr、decr、incrby、decrby、incrbyfloat
-
一、简介
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是C语言编写的、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value开源数据库,并提供多种语言的API。
特点
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。与其他 key - value 缓存产品有以下三个特点:
- 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;
- 支持多种数据类型,不仅仅是简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储;
- 支持数据的备份,即master-slave模式的数据备份。
优势
- 性能极高:读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型:支持二进制安全的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子性:Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性:Redis还支持 publish/subscribe, 通知,,key 过期等等特性。
Redis应用场景
• 缓存(数据查询、短连接、新闻内容、商品内容等等)(使用最多的场景)
• 分布式集群架构中的session分离;
• 聊天室的在线好友列表;
• 任务队列;(秒杀、抢购、12306等等)
• 应用排行榜;
• 网站访问统计
Redis基本通讯模型
执行过程:发送指令-〉执行命令-〉返回结果
执行命令:单线程执行,所有命令进入队列,按顺序执行
单线程快原因:纯内存访问, 单线程避免线程切换和竞争产生资源消耗,RESP协议简单
问题:如果某个命令执行慢,会造成其它命令的阻塞
-
二、Windows安装和配置
下载地址:https://github.com/MSOpenTech/redis/releases
下载 Redis-x64-xxx.zip压缩包到 C:\redis
在当前目录下启动命令行,启动服务,输入命令:redis-server.exe redis.windows.conf
重新打开一个命令行窗口,启动客户端,输入命令:redis-cli.exe -h 127.0.0.1 -p 6379
设置键值对:set name kongsh
取值:get name
-
三、Linux下安装和配置
安装
- yum install gcc-c++ -y
- wget http://download.redis.io/releases/redis-5.0.7.tar.gz
- tar zxf redis-5.0.7.tar.gz
- cd redis-5.0.7
- make
- make install PREFIX=/usr/local/redis
启动服务端
客户端连接
redis-cli -h [IP地址] -p [端口号]
注意:-h,-p参数后必须有空格
-
四、数据结构
Redis支持的数据类型有string,list,hash,set,zset,接下来一一介绍每种类型常用的命令,最后有3个实例。
1.字符串(String)
字符串类型:实际上可以是字符串(包括XML JSON),还有数字(整型,浮点型),二进制(图片、音频、视频),最大不能超过512MB
设值命令:set
- 语法:set key value [expiration EX seconds|PX milliseconds] [NX|XX]
- 示例:
set age 23 ex 10 //10秒后过期 px 10000 毫秒过期
setnx name test //键name不存在时,返回1设置成功;存在的话失败0
set对已经存在的键再次设置时相当于修改操作
set age 33 xx //键存在时,返回OK表示成功,不存在返回nil
取值命令:get
- 语法:get key
如果key存在则返回value, 不存在返回nil
批量设值:mset
- 语法:mset key value [key value ...]
- 示例:
批量获取:
- 语法:mget key [key ...]
同时获取多个键值,没有的话返回nil
- 示例:
注意:若没有mget命令,则要执行n次get命令
计数:incr、decr、incrby、decrby、incrbyfloat
key必须为整数,否则会报错;key不存在的话会创建,而且从0开始自增/减1返回
- 示例:
操作非整数类型会报错
key不存在,会创建并且默认值为0
decr age //整数age减1
incrby age 10 //整数age+10
decrby age 2//整数age -2
incrbyfloat score 89.98 //浮点型score+89.98
追加:append
- 语法:append key value
- 示例:
set content hello; append content world //追加后成helloworld
获取字符串长度:strlen
- 语法:strlen key
- 示例:
set hello 中国
strlen hello//结果6,每个中文占3个字节
截取字符串:getrange
- 语法:getrange key start end
start从0开始,最后一个用-1表示即可,获取的是闭区间,也就是[start, end]
- 示例:
2.哈希(Hash)
哈希hash是一个string类型的键值对映射表,用于存储对象,类似于python的字典
设值:hset
- 语法:hset key field value
成功返回键值对的个数
- 示例:hset user:1 name xiao age 18
取值:hget
- 语法:hget key field
- 示例:hget user:1 name
批量设值:hmset
- 语法:hmset key field value [field value ...] 成功返回OK
- 示例:hmset user:2 name kongsh age 23 addr beijing
批量取值:hmget
- 语法:hmget key field [field ...]
- 示例:hmget user:2 name age addr //返回三行
删值:hdel
- 语法:hdel key field [field ...]
执行成功返回删除的个数,执行失败返回0
- 示例:
hmset user:2 name kongsh age 23 addr beijing
hmget user:2 name age addr
hdel user:2 addr
计算个数:hlen
- 语法:hlen key
成功返回键值对的个数,失败返回0
- 示例:
hlen user:2 //返回2,user:1有两个属性值
hlen user:1
判断field是否存在:hexists
- 语法:hexists key field
若存在返回1,不存在返回0
- 示例
hexists user:2 addr
hexists user:2 name
获取所有field: hkeys
- 语法:hkeys key
key存在返回其所有的field,不存在返回空
- 示例:
hkeys user:2
hkeys user:1
获取所有的value:hvals
- 语法:hvals key
- 示例
hvals user:1
hvals user:2
获取所有的键值对:hgetall
- 语法:hgetall key
- 示例:hgetall user:2
整数加值操作:hincryby
- 语法:hincrby key field increment
- 示例:
hincrby user:2 age 1
浮点数数加值操作:hincrybyfloat
- 语法:hincrbyfloat key field increment
- 示例:hincrbyfloat user:2 age 1.5
3.列表(list)
用来存储多个有序的字符串,一个列表最多可存2的32次方减1个元素,因为有序,可以通过索引下标获取元素或某个范围内元素列表,列表元素可以重复。
添加命令:lpush、rpush
- 语法:lpush key value [value ...]/rpush key value [value ...]
- 示例:
lpush list 1 2 3 //从右向左插入1 2 3, 返回值3
lrange list 0 -1 //从左到右获取列表所有元素
rpush list a b c //从左向右插入a b c, 返回值6
lrange list 0 -1 //从左到右获取列表所有元素
插入命令:linsert
- 语法:linsert key BEFORE|AFTER pivot value
- 示例:
linsert list before a 0 //在a之前插入0
linsert list after c d //在c之后插入d
查找命令:lrange
- 语法:lrange key start stop
索引下标特点:从左到右为0到N-1
- 示例:
返回指定位置元素:lindex
- 语法:lindex key index
- 示例:
lindex list -1
lindex list -3
lindex list 3
获取列表长度:llen
- 语法:llen key
返回指定列表的长度,列表不存在时,返回长度为0
- 示例:
删除列表中的元素:lpop、rpop
- 语法:lpop key、rpop key
- 示例:
lpop list //从左侧删除
rpop list //从右侧删除
4.集合(set)
用户标签,社交,查询有共同兴趣爱好的人,智能推荐。保存多元素,与列表不一样的是集合不允许有重复元素,且集合是无序。一个集合最多可存2的32次方减1个元素,除了支持增删改查,还支持集合交集、并集、差集;
判断键值是否存在:exists
- 语法:exists key [key ...]
判断key代表的集合是否存在,不存在返回0,存在返回1
- 示例:
exists user //检查user键值是否存在,此时返回0
sadd user a b c //向user插入3个元素,返回3
exists user //检查user键值是否存在,此时返回1
添加元素:sadd
- 语法:sadd key member [member ...]
- 示例:
sadd user a b c //向user插入3个元素,返回3
sadd user a b //若再加入相同的元素,则重复无效,返回0
sadd user a b d //只插入d, 返回1
获取集合中所有元素:smembers
- 语法:smembers key
获取集合中所有的元素,返回结果无序
- 示例:
smembers user //获取user的所有元素,
删除集合中元素:srem
- 语法:srem key member [member ...]
执行成功后,返回删除的元素个数,失败返回0
- 示例:
srem user d //返回1,删除d元素
获取集合中元素个数:scard
- 语法:scard key
获取集合中元素的个数,集合不存在返回0
- 示例:
scard user //返回3
交集:sinter
- 语法:sinter key [key ...]
计算交集时,集合的前后顺序没有影响
- 示例:
sinter user user2
差集:sdiff
- 语法:sdiff key [key ...]
返回所有给定 key 与第一个 key 的差集,两个key交换顺序返回的结果有可能不一样
- 示例:
sdiff user user2 //获取user中存在而user2中不存在的元素,返回的是a
sdiff user2 user //获取user2中存在而user中不存在的元素,返回的是d
并集:sunion
- 语法:sunion key [key ...]
返回给定集合的并集
- 示例:
sunion user user2 user3 //获取3个集合的并集
5.有序集合(zset)
常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数,与集合类似,也不能有重复元素。
添加元素:zadd
执行成功,返回操作成功的条数,执行失败返回0
key:键
NX:只有key不存在的时候,zadd才会起作用(只添加不更新)
XX:只有key存在的时候,zadd才会起作用(只更新不添加)
member:有序集合中的成员(相当于集合中的元素)
score:分数
CH:返回zadd修改成员的个数,不写CH时修改member时默认返回0
INCR:当member不存在的时候没什么作用,当member存在时会将score加上member原来的分数
[score member]:一次设置多个score与member。
- 示例:
zadd usr:zan 1 xiao //xiao的点赞数1, 返回操作成功的条数1
zadd usr:zan 15 kongsh 2 lily 3 ksh //返回3
zadd test:1 nx 1 a //键test:1必须不存在,主要用于添加
zadd test:1 xx incr 100 a /键test:1必须存在,主用于修改,此时为101
zadd test:1 xx ch incr -10 a//返回操作结果91,101-10=91
获取元素:zrange
- 语法:zrange key start stop [WITHscoreS]
- 示例:
zrange test:1 0 -1 withscores //查看点赞(分数)与成员名
获取元素:zcard
- 语法:zcard key
- 示例:
zcard test:1 //计算成员个数, 返回3
获取指定元素索引:zrank
- 语法:zrank key member
返回有序集合中指定成员的索引,元素不存在返回nil
- 示例
获取成员排名:zrevrank
- 语法:zrevrank key member
如果成员是有序集 key 的成员,返回成员的排名,名次从0开始。 如果成员不是有序集 key 的成员,返回 nil
- 示例
获取成员分值:zscore
- 语法:zscore key member
返回有序集合中成员的分值
- 示例
zscore test:1 a
有序集合与集合及队列区别
6.Redis全局命令
查看所有键:keys *
键总数 :dbsize
如果存在大量键,线上禁止使用此指令
检查键是否存在:exists key
存在返回1,不存在返回0
删除键:del key
del hello school, 返回删除键个数,删除不存在键返回0
键过期:expire key seconds
set name test
expire name 10,表示10秒过期
查看剩余的过期时间:ttl key
键的数据结构类型:type key
返回键的类型,键不存在返回none
选择数据库:select
用于切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。Redis默认建立了16个数据库,/usr/local/redis/etc/redis.conf:
客户端与Redis建立连接后会默认选择0号数据库,可以使用select命令进行切换。
清空当前数据库中的数据:flushdb
清空所有数据库中的数据:flushall
由于Redis不支持自定义数据库的名字,所以每个数据库都以编号命名。开发者则需要自己记录存储的数据与数据库的对应关系。另外Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么全部数据库都没有权限访问。但是,要正确地理解Redis的“数据库”概念这里不得不提到一个命令:
# 清空一个Redis实例中所有数据库中的数据
redis 127.0.0.1:6379> FLUSHALL
该命令可以清空实例下的所有数据库数据,这与我们所熟知的关系型数据库所不同。关系型数据库多个库常用于存储不同应用程序的数据 ,且没有方式可以同时清空实例下的所有库数据。所以对于Redis来说这些db更像是一种命名空间,且不适宜存储不同应用程序的数据。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。
要注意以上所说的都是基于单体Redis的情况。而在集群的情况下不支持使用select命令来切换db,因为Redis集群模式下只有一个db0