redis基础中的基础

目录​​​​​​​

一、简介

特点

优势

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 缓存产品有以下三个特点:

  • 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;
  • 支持多种数据类型,不仅仅是简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储;
  • 支持数据的备份,即master-slave模式的数据备份。

优势

  1. 性能极高:读的速度是110000次/s,写的速度是81000次/s 。
  2. 丰富的数据类型:支持二进制安全的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  3. 原子性:Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  4. 丰富的特性: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下安装和配置

安装

  1. yum install gcc-c++ -y
  2. wget http://download.redis.io/releases/redis-5.0.7.tar.gz
  3. tar zxf redis-5.0.7.tar.gz
  4. cd redis-5.0.7
  5. make
  6. 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

  • 语法:zadd key [NX|XX] [CH] [INCR] score member [score member ...]

执行成功,返回操作成功的条数,执行失败返回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

 

 

相关文章

在笔者近 3 年的 Java 一线开发经历中,尤其是一些移动端、用...
这一篇文章拖了有点久,虽然在项目中使用分布式锁的频率比较...
本文梳理总结了一些 Java 互联网项目中常见的 Redis 缓存应用...
书接上回,消息通知系统(notification-system)作为一个独立...
Redis 是目前互联网后端的热门中间件之一,在许多方面都有深...
在Java Spring 项目中,数据与远程数据库的频繁交互对服务器...