Redis的基本数据结构及基本命令详解

时间: 2019-06-01阅读: 745标签: redis

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

至于如何安装、配置redis,此处不做讲解。此文主要讲解redis的基本数据结构以及使用redis客户端的基本操作命令。另外下面命令演示时,大写的命令格式为官方定义格式,小写的为具体使用格式


字符串(string)

实际上可以是字符串(包括xml、json),还有数字(整型、浮点型),二进制(图片、音频、视频)

设值命令
//设置一个键的值,可以带一个过期时间
SET key value [EX seconds] [PX milliseconds] [NX|XX]
set name jmx                 //直接设置name=jmx
set version 1.0 ex 10        //设置version=1.0,并且10s后过期
ttl version                  //设置了过期时间之后,使用ttl命令可以看到键的剩余过去时间

//批量设置
MSET key value [key value ...]
mset sex boy age 18         //批量设置sex=boy,age=18

//如果key存在,不执行任何操作,如果key不存在,等价于set命令
SETNX key value
setnx name cndy            //不存在键name就设置成功,存在时设置失败
取值命令
//获取键的值
GET key
get name                 //返回jmx

//批量获取键的值
MGET key [key ...]
mget name sex age         //批量获取name、sex、age,返回jmx、boy、18

虽然存储的是字符串,但是也可以是数字字符串,因此redis支持递增或者递减的操作

数字操作
set num 10                //先在redis中设置一个数字字符串

//对存储在指定key的数值执行原子的加1操作
INCR key
incr num                //num自增加1,并且返回11

//将key对应的数字加decrement
INCRBY key increment
incrby num 10            //num的值加10,返回21

//对key对应的数字做减1操作
DECR key
decr num                 //num减1,返回20

//将key对应的数字减decrement
DECRBY key decrement
decrby num 10            //num值减20,返回10
其他命令
//如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 
//如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作
APPEND key value
append name luckly        //name原来的值为:jmx,执行此命令之后name的值为:jmxluckly

//返回key的string类型value的长度。
//如果key对应的非string类型,就返回错误
STRLEN key
strlen name             //返回jmxluckly的长度9

//截取字符串
//可以使用-1表示最后一个字符串的位置,-2表示倒数第二个字符串的位置
GETRANGE key start end
getrange name 1 5        //返回mxluc,返回第一个到第无个之间的字符串


哈希(hash)

Redis hash是一个string类型的field和value的映射表.一个key可对应多个field,一个field对应一个value。hash特适合用于存储对象。我们假设有一个用户信息如下

用户id用户编码用户名称性别年龄
1jmx君莫笑boy18

接下来我们使用命令来将用户信息以hash的方式存入到redis中

设值命令
//设置 key 指定的哈希集中指定字段的值。
//如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。
//如果字段在哈希集中存在,它将被重写。
HSET key field value
hset user:1 usercode jmx    //设置键user:1的属性usercode的值为jmx

//存在不做任何操作、不存在类似HSET的功能
HSETNX key field value
hsetnx user:1 usercode jmxs    //因为user:1的usercode已存在,所以不执行任何操作。返回0

//批量设置key的属性(多个属性)
HMSET key field value [field value ...]
hmset user:1 usercode jmx sex boy age 18    //同时设值键userf:1的属性usercode、sex、age

//增加 key 指定的哈希集中指定字段的数值
HINCRBY key field increment
hincrby user:1 age 1    //对age属性加1(我又大一岁了)
取值命令
//返回 key 指定的哈希集中该字段所关联的值
HGET key field
hget user:1 usercode    //返回user:1的属性usercode的值jmx(因为上面设值了user:1的usercode的值为jmx)

//返回 key 指定的哈希集中指定字段的值。
//对于哈希集中不存在的每个字段,返回nil值,因为不存在的keys被认为是一个空的哈希集。
//对一个不存在的key执行HMGET将返回一个只含有nil值的列表
HMGET key field [field ...]
hmget user:1 age sex usercode    //返回:18 boy jmx

//返回 key 指定的哈希集中所有的字段和值。
//返回值中,每个字段名的下一个是它的值,所以返回值的长度是哈希集大小的两倍
HGETALL key
hgetall user:1        //返回user:1的所有属性和所有值

//返回 key 指定的哈希集中所有字段的名字
HKEYS key
hkeys user:1        //返回usercode、sex、age

//返回 key 指定的哈希集中所有字段的值
HVALS key
hvals user:1        //返回user:1的所有属性对应的值(不包含属性)
删值命令
//从 key 指定的哈希集中移除指定的域。在哈希集中不存在的域将被忽略。
HDEL key field [field ...]
hdel user:1 age        //移除user:1的age属性
其他命令
//返回hash里面field是否存在
HEXISTS key field
hexists user:1 age        //返回0,因为上面使用hdel命令把age属性移除了

//返回 key 指定的哈希集包含的字段的数量
HLEN key
hlen user:1            //返回2,2个属性(usercode和sex)

//返回hash指定field的value的字符串长度,如果hash或者field不存在,返回0.
HSTRLEN key field
hstrlen user:1 usercode        //返回3,usercode的值为jmx,长度为3
hstrlen user:1 age            //返回0,age属性不存在,返回0


列表(list)

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

设值命令
//将所有指定的值插入到存于 key 的列表的头部
//如果 key 不存在,那么在进行 push 操作前会创建一个空列表。 
//如果 key 对应的值不是一个 list 的话,那么会返回一个错误。
LPUSH key value [value ...]
lpush list a b c         //把a b c依次从头部放入list中

//依次从尾部插入列表,使用方式和LPUSH方式一样,省略演示代码
RPUSH key value [value ...]

//在某个内容之前或者之后插入
LINSERT key BEFORE|AFTER pivot value
linsert list before b tearcher        //在b之前插入tearcher
取值命令
//移除并且返回 key 对应的 list 的第一个元素
LPOP key
lpop list        //返回并移除列表中的第一个元素

//移除并返回存于 key 的 list 的最后一个元素
RPOP key
rpop list        //返回并移除列表中的最后一个元素
查询命令
//返回存储在 key 的列表里指定范围内的元素
//从0开始。-1表示最后一个元素
LRANGE key start stop
lrange list 0 -1        //查询list的所有元素(0为起始下标,-1为终止下标)

//返回存储在 key 里的list的长度
LLEN key
llen list
删除命令
//从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 
//这个 count 参数通过下面几种方式影响这个操作:
//count > 0: 从头往尾移除值为 value 的元素。
//count < 0: 从尾往头移除值为 value 的元素。
//count = 0: 移除所有值为 value 的元素。
LREM key count value
lrem list 0 a        //移除list中所有的a


集合(set)

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据

添加命令
//添加一个或多个指定的member元素到集合的key中
SADD key member [member ...]
sadd sets write read play write        //因为不能重复,因此sets中只有write、read、play
查询命令
//返回key集合所有的元素
SMEMBERS key
smembers sets        //获取sets中的所有元素

//返回成员 member 是否是存储的集合 key的成员
SISMEMBER key member
sismember sets read        //返回1,表示存在该元素

//查询集合的长度
SCARD key
scard sets        //返回sets中总共有多少元素之和

//取指定所有集合的交集
SINTER key [key ...]
sinter set1 set2 set3    //取set1、set2、set3三个集合的交集

//取所有指定集合的并集
SUNION key [key ...]
sunion set1 set2 set3    //取set1、set2、set3三个集合的并集

//取集合的差集
SDIFF key [key ...]
sidff set1 set2            //取集合set1、set2的差集
移除命令
//在key集合中移除指定的元素
SREM key member [member ...]
srem sets play        //将play属性从sets中移除


顺序集合(zset)

zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。因为带有排序,所以适合比如排行榜之类的功能。

添加命令
//将所有指定成员添加到键为key有序集合(sorted set)里面
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
zadd scan 1500 gooda 500 goodb 1000 goodc    //商品a、b、c的浏览量为分别为1500、500、1000
zadd scan nx 100 goodd   //键scan必须不存在,主用于添加
zadd scan xx incr 200 goodd   //键scan必须存在,主用于修改,商品d新增200浏览量

//为有序集key的成员member的score值加上增量increment
ZINCRBY key increment member
zincrby scan 200 gooda        //给商品a增加200的浏览量
查看命令
//返回存储在有序集合key中的指定范围的元素
//-1未之后一个元素
//返回的元素可以认为是按得分从最低到最高排列
ZRANGE key start stop [WITHSCORES]
zrange scan 0 1 withscores        //查询点击量最低的2个商品

//返回存储在有序集合key中的指定范围的元素
//-1未之后一个元素
//返回的元素可以认为是按得分从最高到低高排列
ZREVRANGE key start stop [WITHSCORES]
zrevrange scan 0 1 withscores        //查询点击量最高的2个商品

//以下命令比较简单,省略演示
//返回有序集key中成员member的排名(从小到大)
ZRANK key member
//返回有序集key中成员member的排名(从大到小)
ZREVRANK key member
//返回有序集key中,成员member的score值
ZSCORE key member
//返回key的有序集元素个数
ZCARD key
删除命令
//删除一个元素
ZREM key member [member ...]
zrem scan goodc        //将商品c的浏览量从集合中删除


其他常用命令

除了上述类型操作命令之后,还要一些常用的命令如下

//返回key所存储的value的数据结构类型,它可以返回string, list, set, zset 和 hash等不同的类型
TYPE key
type name    //查看键name类型,返回string

//选择一个数据库,下标值从0开始,一个新连接默认连接的数据库是DB0
SELLECT index
select 1    //切换到DB1

//为redis服务请求设置一个密码
AUTH password
auth 123456        //如果设置了redis密码的话,使用此命令设置密码

//删除当前数据库里面的所有数据
FLUSHDB
//删除所有数据库里面的所有数据,注意不是当前数据库,而是所有数据库
FLUSHALL
//返回当前数据里面keys的数量
DBSIZE

//查找所有符合给定模式pattern(正则表达式)的 key
KEYS pattern
keys *         //查询所有的key,慎用(因为redis是单线程,使用此命令会阻塞其他的命令)


总结

因为命令太多,上述命令只是redis中的一部分命令而已。更多的命令希望大家去redis官网查看相关的文档。

来自:https://segmentfault.com/a/1190000019340873


站长推荐

1.阿里云: 本站目前使用的是阿里云主机,安全/可靠/稳定。点击领取2000元代金券、了解最新阿里云产品的各种优惠活动点击进入

2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各类产品的最新活动,优惠券领取点击进入

3.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/3497

Redis可视化管理工具有哪些?

redis 是当前非常流行的缓存数据库,得益于其简单的 key-value 模式的数据存储和丰富的数据类型与事件机制使得 redis 成为当前后端开发中不可或缺的利器。下面推荐一些好用的 redis 的管理工具

Redis的正确使用姿势

说到分布式缓存,可能大多数人脑海浮现的就是redis了,为什么redis能够在竞争激烈的缓存大战中脱颖而出呢?原因无非有一下几点:性能好,丰富的特性跟数据结构,api操作简单。但是用的人多了,就会出现很多不规范或者疏忽的地方,严重的时候甚至会导致生产事故

Redis 5种主要数据类型和命令

redis常用数据结构strig、list、hash、set、zset,这是最常用的5中redis数据结构,其实还有些不太常用的数据结构比如:HyperLogLog、GeoHash、PubSub等

Redis分布式锁

redis:Redis是开源,内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.采用单进程单线程模型,并发能力强大,主流的分布式缓存工具。加锁通过setnx向特定的key值写入一个随机值,并且同时设置失效时间,写值成功即加锁成功.

docker搭建redis集群

从docker库获取ruby镜像;创建虚拟网卡;查看网卡信息;查看redis-net虚拟网卡网关ip;创建需要挂载的目录以及文件;在/docker/redis目录下创建一个sh脚本文件;执行脚本创建挂载目录以及配置文件

基于redis实现定时任务

业务中碰到的需求(抽象描述一下):针对不同的用户能够实现不同时间的间隔循环任务。比如在用户注册成功24小时后给用户推送相关短信等类似需求。使用crontab?太重,且基本不现实,不可能给每一个用户在服务器上生成一个定时任务。

Redis 在现实世界的 5 个用法

Redis是一个强大的内存数据结构存储,包含数据库,缓存和消息代理等多种用途。大多数人经常认为它不过是一个简单的键值存储,但其实它有更多的能力。下面我将会总结一些Redis可以做的事情的真实例子。

redis用在哪里?redis 应用场景

Redis是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis的主从复制

Redis配置成主从模式,主库(Master)只负责写数据,从库(Slave)只负责读数据。一个主库可以拥有多个从库,但一个从库只能隶属于一个主库。

分布式锁的redis缓存使用方式

目前有很多成熟的缓存产品,包括Redis,memcached等。这里以Redis为例来分析下使用缓存实现分布式锁的方案。主要的实现方式是使用Jedis.setNX方法来实现。以上实现方式同样存在几个问题:

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广