目录
一、简介
特点
优势
Redis应用场景
Redis基本通讯模型
二、Windows安装和配置
三、Linux下安装和配置
启动服务端
客户端连接
四、数据结构
1.字符串(String)
设值命令:set
取值命令:get
批量设值:mset
批量获取:
计数:incr、decr、incrby、decrby、incrbyfloat
追加:append
获取字符串长度:strlen
截取字符串:getrange
2.哈希(Hash)
设值:hset
取值:hget
批量设值:hmset
批量取值:hmget
删值:hdel
计算个数:hlen
判断field是否存在:hexists
获取所有field: hkeys
获取所有的value:hvals
获取所有的键值对:hgetall
整数加值操作:hincryby
浮点数数加值操作:hincrybyfloat
3.列表(list)
添加命令:lpush、rpush
插入命令:linsert
查找命令:lrange
返回指定位置元素:lindex
获取列表长度:llen
删除列表中的元素:lpop、rpop
4.集合(set)
判断键值是否存在:exists
添加元素:sadd
获取集合中所有元素:smembers
删除集合中元素:srem
获取集合中元素个数:scard
交集:sinter
差集:sdiff
并集:sunion
5.有序集合(zset)
添加元素:zadd
获取元素:zrange
获取元素:zcard
获取指定元素索引:zrank
获取成员排名:zrevrank
获取成员分值:zscore
有序集合与集合及队列区别
6.Redis全局命令
查看所有键:keys *
键总数 :dbsize
检查键是否存在:exists key
删除键:del key
键过期:expire key seconds
查看剩余的过期时间:ttl key
键的数据结构类型:type key
选择数据库:select
清空当前数据库中的数据:flushdb
清空所有数据库中的数据:flushall
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是C语言编写的、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value开源数据库,并提供多种语言的API。
官网:https://redis.io/
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。与其他 key - value 缓存产品有以下三个特点:
• 缓存(数据查询、短连接、新闻内容、商品内容等等)(使用最多的场景)
• 分布式集群架构中的session分离;
• 聊天室的在线好友列表;
• 任务队列;(秒杀、抢购、12306等等)
• 应用排行榜;
• 网站访问统计
执行过程:发送指令-〉执行命令-〉返回结果
执行命令:单线程执行,所有命令进入队列,按顺序执行
单线程快原因:纯内存访问, 单线程避免线程切换和竞争产生资源消耗,RESP协议简单
问题:如果某个命令执行慢,会造成其它命令的阻塞
下载地址: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
安装
redis-cli -h [IP地址] -p [端口号]
注意:-h,-p参数后必须有空格
Redis支持的数据类型有string,list,hash,set,zset,接下来一一介绍每种类型常用的命令,最后有3个实例。
字符串类型:实际上可以是字符串(包括XML JSON),还有数字(整型,浮点型),二进制(图片、音频、视频),最大不能超过512MB
set age 23 ex 10 //10秒后过期 px 10000 毫秒过期
setnx name test //键name不存在时,返回1设置成功;存在的话失败0
set对已经存在的键再次设置时相当于修改操作
set age 33 xx //键存在时,返回OK表示成功,不存在返回nil
如果key存在则返回value, 不存在返回nil
同时获取多个键值,没有的话返回nil
注意:若没有mget命令,则要执行n次get命令
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
set content hello; append content world //追加后成helloworld
set hello 中国
strlen hello//结果6,每个中文占3个字节
start从0开始,最后一个用-1表示即可,获取的是闭区间,也就是[start, end]
哈希hash是一个string类型的键值对映射表,用于存储对象,类似于python的字典
成功返回键值对的个数
执行成功返回删除的个数,执行失败返回0
hmset user:2 name kongsh age 23 addr beijing
hmget user:2 name age addr
hdel user:2 addr
成功返回键值对的个数,失败返回0
hlen user:2 //返回2,user:1有两个属性值
hlen user:1
若存在返回1,不存在返回0
hexists user:2 addr
hexists user:2 name
key存在返回其所有的field,不存在返回空
hkeys user:2
hkeys user:1
hvals user:1
hvals user:2
hincrby user:2 age 1
用来存储多个有序的字符串,一个列表最多可存2的32次方减1个元素,因为有序,可以通过索引下标获取元素或某个范围内元素列表,列表元素可以重复。
从左侧添加或者从右侧添加,执行成功后返回列表中元素的总个数
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 list before a 0 //在a之前插入0
linsert list after c d //在c之后插入d
索引下标特点:从左到右为0到N-1
lindex list -1
lindex list -3
lindex list 3
返回指定列表的长度,列表不存在时,返回长度为0
lpop list //从左侧删除
rpop list //从右侧删除
用户标签,社交,查询有共同兴趣爱好的人,智能推荐。保存多元素,与列表不一样的是集合不允许有重复元素,且集合是无序。一个集合最多可存2的32次方减1个元素,除了支持增删改查,还支持集合交集、并集、差集;
判断key代表的集合是否存在,不存在返回0,存在返回1
exists user //检查user键值是否存在,此时返回0
sadd user a b c //向user插入3个元素,返回3
exists user //检查user键值是否存在,此时返回1
sadd user a b c //向user插入3个元素,返回3
sadd user a b //若再加入相同的元素,则重复无效,返回0
sadd user a b d //只插入d, 返回1
获取集合中所有的元素,返回结果无序
smembers user //获取user的所有元素,
执行成功后,返回删除的元素个数,失败返回0
srem user d //返回1,删除d元素
获取集合中元素的个数,集合不存在返回0
scard user //返回3
计算交集时,集合的前后顺序没有影响
sinter user user2
返回所有给定 key 与第一个 key 的差集,两个key交换顺序返回的结果有可能不一样
sdiff user user2 //获取user中存在而user2中不存在的元素,返回的是a
sdiff user2 user //获取user2中存在而user中不存在的元素,返回的是d
返回给定集合的并集
sunion user user2 user3 //获取3个集合的并集
常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数,与集合类似,也不能有重复元素。
执行成功,返回操作成功的条数,执行失败返回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 test:1 0 -1 withscores //查看点赞(分数)与成员名
zcard test:1 //计算成员个数, 返回3
返回有序集合中指定成员的索引,元素不存在返回nil
如果成员是有序集 key 的成员,返回成员的排名,名次从0开始。 如果成员不是有序集 key 的成员,返回 nil
返回有序集合中成员的分值
zscore test:1 a
如果存在大量键,线上禁止使用此指令
存在返回1,不存在返回0
del hello school, 返回删除键个数,删除不存在键返回0
set name test
expire name 10,表示10秒过期
返回键的类型,键不存在返回none
用于切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。Redis默认建立了16个数据库,/usr/local/redis/etc/redis.conf:
客户端与Redis建立连接后会默认选择0号数据库,可以使用select命令进行切换。
由于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