热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大数据工程师面试必备的Redis知识(上)京东HR面试纲要

Redis是开源的(BSD协议),使用C语言编写,基于内存的且支持持久化,高性能的Key-Value的NoSQL数据库单线程运行,省去了线程上下文切换带来的性能开销,效率更高。支持

Redis是开源的(BSD协议),使用C语言编写,基于内存的且支持持久化,高性能的Key-ValueNoSQL数据库单线程运行,省去了线程上下文切换带来的性能开销,效率更高。

支持数据结构类型丰富,有字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) , 位图( bitmaps ), hyperloglogs 和地理空间(geospatial) 索引半径查询。 支持众多主流语言的客户端,C、C++、Python、Erlang、R、C#、Java、PHP、Objective-C、Perl、Ruby、Scala、Go、Javascript

用途:缓存(StackOverFlow)、数据库(微博)、消息中间件(微博) 队列系统

官方网站: http://www.redis.cn

Reids中所有数据存储在内存当中,性能有优势,同时提供持久化功能,将数据异步写入到硬盘中。

字符串一种最基本的Redis值类型(字节数组)。

Redis值是二进制安全的,这意味着可以用任何二进制序列作为key值。

一个字符串类型的值最多能存储512M字节的内容

key : string

value: string和其他几种数据类型

设置字符串值 set get

apeend key value 追加

SET key value [EX seconds] [PX milliseconds] [NX|XX]

EX 设置过期时间,秒,等同于SETEX key seconds value

EXPIRE 设置多少秒或者毫秒后过期

PX 设置过期时间,毫秒,等同于PSETEX key milliseconds value

NX 键存在时,不能设置,等同于SETNX key value

XX 键存在时,才能设置

EXPIREAT key timestamp 设置在指定Unix时间戳过期

PERSIST key 删除过期

Time To Live,Key的剩余生存时间查看剩余生存时间

TTL key PTTL key key存在但没有设置TTL,返回-1 key存在,但还在生存期内,返回剩余的秒或者毫秒 key曾经存在,但已经消亡,返回-2(2.8版本之前返回-1)

设置多个键的字符串值

MSET key value [key value …]

键不存在时,设置字符串值

MSETNX key value [key value …]

注意是原子操作,对多个kv,要不成功都不成功

查找键

KEYS pattern

pattern取值 * 任意长度字符 ? 任意一个字符 [] 字符集合,表示可以是集合中的任意一个

键是否存在

EXISTS key

键重命名

RENAME key newkey

RENAMENX key newkey 如果存在不能替换

键删除

DEL key [key …]

获取值

GET key

获取多个给定的键的值

MGET key [key …]

返回旧值并设置新值,如果键不存在,就创建并赋值

GETSET key value

字符串长度

STRLEN key

获取value底层存储的数据结构类型

object encoding key

字符串类型的内部编码有三种:

int 8个字节的长整型

embstr 小于39字节的字符串

raw 大于39字节的字符串

键类型

TYPE key

步长1的增减

INCR key

DECR key

步长X增减 float

INCRBY key decrement

DECRBY key decrement

字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串

追加字符串,如果键存在就追加;如果不存在就等同于SET key value

APPEND key value

通过索引获取子字符串

索引值从0开始,-1表示最右边第一个值,0 -1表所有

GETRANGE key start end

覆盖字符串

SETRANGE key offset value

redis的位图操作 bitmap 【字节数组】

位图不是真正的数据类型,它是定义在字符串类型中一个字符串类型的值最多能存储

位上限=2^32 b

设置某一位上的值

SETBIT key offset value (0/1)

offset位偏移量,从0开始

获取某一位上的值

GETBIT key offset

返回指定值0或者1在指定区间上第一次出现的位置偏移量

BITPOS key bit [start] [end](字节索引)

位操作

0 1 0 0 0 0 0 1

1 1 1 0 0 0 0 1

0 1 0 0 0 0 0 1

对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上

BITOP AND destkey key [key …] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey

BITOP OR destkey key [key …] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey

BITOP XOR destkey key [key …] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey

BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey

当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0,空的 key 也被看作是包含 0 的字符串序列

BITCOUNT key [start] [end] > start end Byte位的索引 正负方向 区别byte位和字节位的区别

最常用的就是 BITCOUNT

登录不同的库

redis-cli –help

redis-cli -n n=【0-15】

清除当前库数据

FLUSHDB

清除所有库中的数据

FLUSHALL

redis的list列表

基于Linked List实现,双向无环链表

元素是字符串类型

列表头尾增删快,中间增删慢,增删元素是常态

元素可以重复出现

最多包含2^32-1元素

列表的索引

从左至右,从0开始

从右至左,从-1开始

队列:L/R R/L 栈: L/L R/R 数组:LINDEX LSET 阻塞:BL BR

左右或者头尾压入元素

LPUSH key value [value …]

LPUSHX key value 如存在才可以x放入元素

RPUSH key value [value …]

RPUSHX key value

左右或者头尾弹出元素

LPOP key

RPOP key

从一个列表尾部弹出元素压入到另一个列表的头部 string getset

RPOPLPUSH k1 k2

返回列表中指定范围元素

LRANGE key start stop

LRANGE key 0 -1 表示返回所有元素

获取指定位置的元素

LINDEX key index

设置指定位置元素的值

LSET key index value

列表长度,元素个数 string strlen

LLEN key = LRANGE KEY 0 -1

从列表头部开始删除值等于value的元素count次,LIST 可以重复出现

LREM key count value

count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count

count <0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值

count = 0 : 移除表中所有与 value 相等的值

去除指定范围元素

LTRIM key start stop

LTRIM u1234:forumid:comments 0 499

在列表中某个存在的值(pivot)前或后插入元素

LINSERT key BEFORE|AFTER pivot value

key和pivot不存在,不进行任何操作

阻塞

如果弹出的列表不存在或者为空,就会阻塞

超时时间设置为0,就是永久阻塞,直到有数据可以弹出

如果多个客户端阻塞在同一个列表上,使用First In First Service原则,先到先服务 左右或者头尾阻塞弹出元素

BLPOP key [key &#8230;] timeout

BRPOP key [key &#8230;] timeout

从一个列表尾部阻塞弹出元素压入到另一个列表的头部 BRPOPLPUSH k1 k2 timeout

Redis的hash散列

《大数据工程师面试必备的Redis知识(上) 京东HR面试纲要》
《大数据工程师面试必备的Redis知识(上) 京东HR面试纲要》 来源于京东HR技术官工作群

由field和关联的value组成的map键值对
field和value是字符串类型
一个hash中最多包含2^32-1键值对

设置单个字段
HSET key field(字段) value
HSETNX key field value
设置多个字段
HMSET key field value [field value &#8230;]
返回字段个数
HLEN key
判断字段是否存在
HEXISTS key field
key或者field不存在,返回0

返回字段值
HGET key field
返回多个字段值
HMGET key field [field &#8230;]
返回所有的键值对
HGETALL key
返回所有字段名
HKEYS key
返回所有值
HVALS key

在字段对应的值上进行整数的增量计算
HINCRBY key field increment
在字段对应的值上进行浮点数的增量计算
HINCRBYFLOAT key field increment
删除指定的字段
HDEL key field [field &#8230;]

hash散列的优势
节约内存空间。因为每创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等),所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,花在管理数据库键上的CPU也会越多在字段对应的值上进行浮点数的增量计算

使用场景
用户维度统计统计数包括:关注数、粉丝数、喜欢商品数、发帖数 用户为Key,不同维度为Field,Value为统计数
比如关注了5人
HSET user:node01 follow 5 HINCRBY
user:node01 follow 1

不适合hash的情况
使用二进制位操作命令:
因为Redis目前支持对字符串键进行SETBIT、GETBIT、BITOP等操作,如果你想使用这些操作,那么只能使用字符串键,虽然散列也能保存二进制数据
使用过期键功能:
Redis的键过期功能目前只能对键进行过期操作,而不能对散列的字段进行过期操作,因此如果你要对键值对数据使用过期功能的话,那么只能把键值对储存在字符串里面

Redis的set集合
无序的、去重的
元素是字符串类型
最多包含2^32-1元素
注意, SMEMBERS 有可能返回不同的结果,所以,如果需要存储有序且不重复的数据使用有序集合,存储有序可重复的使用列表

增加一个或多个元素
SADD key member [member &#8230;]元素已经存在,自动忽略
移除一个或者多个元素
SREM key member [member &#8230;]元素不存在,自动忽略
返回集合包含的所有元素
SMEMBERS key 如果集合元素过多,例如百万个,需要遍历,可能会造成服务器阻塞,生产环境应避免使用

检查给定元素是否存在于集合中
SISMEMBER key member

SRANDMEMBER key [count]
如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。
如果 count 大于等于集合基数,那么返回整个集合 最多返回整个集合 conut>=0
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值 count <0 长度为count绝对值,元素可能重复
如果 count 为 0,返回空
如果 count 不指定,随机返回一个元素

返回集合中元素的个数,键的结果会保存信息,集合长度就记录在里面,所以不需要遍历
SCARD key
随机从集合中移除并返回这个被移除的元素
SPOP key
把元素从源集合移动到目标集合
SMOVE source destination member

差集,具有方向性

SDIFF key [key &#8230;]从第一个key的集合中去除其他集合和自己的交集部分

SDIFFSTORE destination key [key &#8230;]将差集结果存储在目标key中

交集

SINTER key [key &#8230;],取所有集合交集部分

SINTERSTORE destination key [key &#8230;],将交集结果存储在目标key中

并集

SUNION key [key &#8230;],取所有集合并集

SUNIONSTORE destination key [key &#8230;],将并集结果存储在目标key中

新浪微博的共同关注需求:当用户访问另一个用户的时候,会显示出两个用户共同关注哪些相同的用户

设计:将每个用户关注的用户放在集合中,求交集即可

实现如下:

peter={&#8216;john&#8217;,&#8217;jack&#8217;,&#8217;may&#8217;}

ben={&#8216;john&#8217;,&#8217;jack&#8217;,&#8217;tom&#8217;}

那么peter和ben的共同关注为:

SINTER peter ben 结果为 {&#8216;john&#8217;,&#8217;jack&#8217;}

SortedSet集合

类似Set集合

有序的、去重的

元素是字符串类型 每一个元素都关联着一个浮点数分值(Score),并按照分值从小到大的顺序排列集合中的元素。分值可以相同

最多包含2^32-1元素

注意:计算机并不能精确表达每一个浮点数,都是一种近似表达

增加

Zadd key score member [member &#8230;]

移除一个或者多个元素 ,元素不存在,自动忽略

ZREM key member [member &#8230;]

ZREM fruits 番石榴 梨 芒果

显示分值

ZSCORE key member

ZSCORE fruits 芒果

增加或者减少分值

ZINCRBY key increment member increment为负数就是减少 ZINCRBY fruits 1.5 西瓜

返回元素的排名(索引)从小到大

ZRANK key member

返回元素的逆序排名

ZREVRANK key member

返回指定索引区间元素 从大到小

ZRANGE key start stop [WITHSCORES] 如果score相同,则按照字典序lexicographical order 排列 默认按照score从小到大,如果需要score从大到小排列,使用ZREVRANGE

返回指定分值区间元素

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

返回score默认属于[min,max]之间,元素按照score升序排列,score相同字典序 LIMIT中offset代表跳过多少个元素,count是返回几个。类似于Mysql 使用小括号,修改区间为开区间,例如(5、(10、5) -inf和+inf表示负无穷和正无穷

返回指定分值区间元素

ZREVRANGEBYSCORE key min max

移除指定索引排名范围的元素

ZREMRANGEBYRANK key start stop

移除指定分值范围的元素

ZREMRANGEBYSCORE key min max

返回集合中元素个数

ZCARD key 返回指定范围中元素的个数

ZCOUNT key min max

并集

ZUNIONSTORE destination numkeys key [key &#8230;] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

numkeys指定key的数量,必须

WEIGHTS选项,与前面设定的key对应,对应key中每一个score都要乘以这个权重

AGGREGATE选项,指定并集结果的聚合方式 SUM:将所有集合中某一个元素的score值之和作为结果集中该成员的score值 MIN:将所有集合中某一个元素的score值中最小值作为结果集中该成员的score值 MAX:将所有集合中某一个元素的score值中最大值作为结果集中该成员的score值

交集

ZINTERSTORE destination numkeys key [key &#8230;] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

numkeys指定key的数量,必须

WEIGHTS选项,与前面设定的key对应,对应key中每一个score都要乘以这个权重

AGGREGATE选项,指定并集结果的聚合方式 SUM:将所有集合中某一个元素的score值之和作为结果集中该成员的score值 MIN:将所有集合中某一个元素的score值中最小值作为结果集中该成员的score值 MAX:将所有集合中某一个元素的score值中最大值作为结果集中该成员的score值


推荐阅读
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
author-avatar
sawachan_107
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有