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

更新日期: 2019-06-01阅读: 3.3k标签: 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


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

在使用redis-cluster之前你需要知道这些事

前段时间基础架构组、DBA还有云盘团队一起推广了phpredis的RedisCluster的线上使用,目前线上业务已经稳定,单业务的规模水平是:Qps平均15W,数据量在700G左右。现对这段时间的工作和所遇到的一些常见问题进行简单总结

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

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

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

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

Redis 中 Lua 脚本的应用和实践

前段时间组内有个投票的产品,上线前考虑欠缺,导致被刷票严重。后来,通过研究,发现可以通过 redis lua 脚本实现限流,这里将 redis lua 脚本相关的知识分享出来,讲的不到位的地方还望斧正。

Redis在Php项目中的实际应用场景

Redis在Php项目中的实际应用场景:商品维度计数、用户维度计数、存储社交关系、用作缓存代替memcached、反spam系统、用户Timeline/Feeds、最新列表&排行榜、消息通知、将Redis用作消息队列

PHP使用redis防止大并发下二次写入

php调用redis进去读写操作,大并发下会出现:读取key1,没有内容则写入内容,但是大并发下会出现同时多个php进程写入的情况,这个时候需要加一个锁,即获取锁的php进程有权限写。

Redis的主从复制

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

Redis常用命令

连接操作命令,持久化,远程服务控制,对value操作的命令,String,List,Set,Hash,Redis 发布订阅命令,Redis 事务命令,查看keys个数,清空数据库

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

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

Redis的正确使用姿势

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

点击更多...

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