202101 Redis入门总结,实验及面试题

一:是什么?

Redis是一个使用ANSI C编写的开源、支持网络基于内存分布式可选持久性键值对存储数据库
-----维基百科

对以下几点做解释:
1:C编写 在对压缩包解压编译后进入src文件夹可以发现大部分是C文件
图片说明
2:支持网络
3:基于内存 基于内存有什么好处呢?一个字,快!计算机对内存处理显然比对磁盘处理要快的多,但是有的人就会疑惑,内存可是断电内容消失的,如果宕机了数据不就全部消失了么?
4:分布式 可部署在多态服务器上,相互协作,可拓展性好。
5:持久化 说直接点,将数据保存在磁盘。因为是基于内存,数据不是永久存储的,所以redis会基于某些策略定时地将内存中的数据持久化保存到磁盘
6:键值对 key-value型,不是传统的关系型数据库,不同于传统的SQL脚本

二:为什么?
用oracle不香么?为什么要用redis呢?
前提:我们注意到redis是基于内存的,快!

传统数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态
网站已经显得力不从心,暴露了很多难以克服的问题统的关系数据,例如:
High performance* - 对数据库高并发读写的需求;
Huge Storage - 对海量数据的高效率存储和访问的需求;
High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求

面对上述三高问题,关系数据库遇到了难以克服的障碍,而对于web2.0网站来说,关系数据库的很多主要特性却往往无用武之地,例如:
– 数据库事务一致性需求很多web实时系统并不要求严格的数据库事务,对读一致性的要求很低,
–有些场合对写一致性要求也不高。因此数据库事务管理成了数据库高负载下一个沉重的负担;
– 数据库的写实时性和读实时性需求对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出来这条数据的,但是对于很多web应用来说,并不要求这么高的实时性。
– 对复杂的SQL查询,特别是多表关联查询的需求。任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询,特别是SNS类型的网站,从需求以及产品设计角度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。

一句话,传统数据库特有的特性导致无法解决上述“三高”问题,于是redis应运而生!

三:怎么做?
下面演示一些入门的实验:

一:安装运行
1:下载压缩包

# wget http://download.redis.io/releases/redis-6.0.8.tar.gz

2:解压(此时会出现一个名为redis-6.0.8的文件夹)

# tar xzf redis-6.0.8.tar.gz

3:进入该文件夹

#cd redis-6.0.8

4:编译

# make

5:启动服务器端。编译完成后进入src文件夹,直接运行redis-server(./ 说明是在当前文件夹下,即src下)

./redis-server

图片说明
注意警告。。。这是一个小注意点,下文会提到!(警告我最好用配置文件启动服务器端!)
6:启动客户端去连接服务器端。直接运行redis-cli(./ 说明是在当前文件夹下,即src下)
图片说明
如此就可对redis进行操作了。
注意点:之前启动服务端是直接启动,即使用./redis-server命令,这样启动之后一旦退出进程就被杀死了,之后再使用./redis-cli命令连接服务端就会失败。所以需要从另一种方式启动,即使用./redis-server ../redis.conf命令(注意../ 代表上一级目录下的文件) 需要修改配置文件 redis.conf将daemonize no 改为 daemonize yes.这样就可以后台运行了!

下面给出redis.conf常用的配置参数,redis.conf是与src同级目录
图片说明
图片说明
图片说明

在Linux中使用RPM包的方式安装的redis数据库,默认监听localhost接口的6379,如果需要远程连接redis数据库需要将redis.conf配置文件中的bind 127.0.0.1 改为 bind 0.0.0.0; 并将数据库连接验证密码打开requirepass(改为0.0.0.0 表明其他主机也可访问,须输入密码,密码可在配置文件中设置)

二:简单操作
1:查看密码

127.0.0.1:6379> config get requirepass

2:使用help命令 + <tab> tab键主次列出帮助的对象
例如</tab>

help @generic

图片说明
3:然后我们选择其中一个(例如第一个 DEL)

127.0.0.1:6379> help del

图片说明
三:基本类型操作
首先有以下五种常用数据类型
图片说明
下面分别给出常用操作
1: set get
图片说明
2:setnx key存在时不进行设置。返回0,如果不存在设置并返回1
图片说明
3:setex 存值时设置过期时间
图片说明
4:setrange 替换字符串
(注意 SETRANGE mail 3 & //把第3位替换成&符号(从0开始))
图片说明
5:mset or msetnx 多值存入
(注意 FLUSHALL将之前键值全部清空)
图片说明
6:mget 多值获取

7:incr、decr 数字类型自增自减 +1 -1
(注意:如果是其他非数字类型,自增将报错)
图片说明
8:hset hget
图片说明
9:hmset、hmget 多参数值传入和获取
图片说明
10:hincrby 加(减)法操作 hincrbyfloat 浮点型操作
图片说明
11:hdel删除指定的field hkeys显示对象中的所有field的key
图片说明
12:hvals 显示对象中所有field的value
图片说明
13:hgetall 获取所有field的key value
图片说明
14:lpush list的左插入 rpush list的右侧插入(list 的tail)
(注意 lrange 列举出list元素)
图片说明
15:LPOP ,RPOP 出栈操作,元素出栈的同时会从list中删除
图片说明
16:LTRIM 剪切list
图片说明
17:insert 插入操作,可指定元素之前(before)或之后(after)插入
图片说明
18:lset 替换指定下标元素、lindex 返回index位置上的元素
图片说明
19:sadd添加元素 出现重复的元素,会忽略掉已存在的
图片说明
20:smembers 查看set中的元素 srem 删除元素
图片说明
21:sinter、sunion 取集合的交集 、并集
图片说明
22:sdiff 差集
图片说明
23:sdiffstore、sinterstore、sunionstore 将返回结果存储到新的集合中
图片说明
24:smove从一个set中移除元素添加到另外一个set中,实质是srem 和 sadd的原子化操作
图片说明
25:scard、smembers、sismember 查看元素个数、查看所有元素、是否存在某个元素
图片说明
26:zadd 比set的插入多了一个分数。以这个分数的大小来排序
(注意:使用hash表和skiplist实现。插入和查找更快。按指定的score大小来排序。可在需要分数名次排序的场景使用。比如考试名次、网站排名(为搜索提供排序)、时间戳当成score(有时间顺序的数据)、用户个性化兴趣标签)
图片说明
27:对已存在元素zadd可修改顺序
图片说明
28:zadd set1 incr 5 aaa 对aaa加5分 zrem 删除元素
图片说明
29:zrangebyscore 指定分数区间查找元素
图片说明
30:zrevrange set1 0 -1 withscores倒序查找元素(默认逆序)
图片说明
31:zrank 显示一个元素的排名,非显示分数,而是从0开始的排名
图片说明
32:zremrangebyrank 按排名顺序删除元素;zremrangebyscore 按分数序号删除
图片说明
33:zcard 返回集合里所有元素个数
图片说明
四:redis常见面试题

洋芋同学学习笔记 文章被收录于专栏

洋芋同学的学习笔记(都是入门的知识)

全部评论

相关推荐

头像
不愿透露姓名的神秘牛友
03-13 14:57
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务