Redis基础——安装与基础命令的学习

NoSQL数据库

1.NoSQL数据库概述
NoSQL(NoSQL = Not Only SQL ),意为“不仅仅是SQL”,泛指非关系型的数据库
NoSQL不依赖业务逻辑方式存储,而是以简单的key-value模式存储。因此大大增加了数据库的扩展能力

不遵循SQL标准
不支持ACID
远超SQL的性能

2.NoSQL适用场景

对数据高并发的读写
海量数据的读写
对数据高扩展性的

常见的NoSQL数据库有:Memcache、Redis、MongoDB等等

下面将进行Redis的学习,首先安装Redis,安装地址为:Redis安装地址,点击箭头所指的处下载Redis(如下图)

在这里插入图片描述

下载完成后就需要安装了,一般是安装在Linux系统上进行使用(当然也有Windows系统,不过github上好像很久没有维护了,所以默认选择在Linux系统上进行安装)
在Linux系统操作的话需要安装两个小工具,就是xshell(远程连接工具)和xftp(图形化工具),现在要收费了,所以我们只能申请免费的版本了,虽然相对于收费的有限制的地方,但是对于我们学习以及足够用了,点击即可进入下载地址:https://www.xshell.com/zh/xshell-download/
再点击免费授权产品页面去申请,他就会发到你的邮箱,然后下载就好了。非常的方便

在这里插入图片描述

这些都完成之后,用xshell连接虚拟机,有条件的小伙伴可以连接云服务器进行操作。连接完成之后用xftp将下载好的redis安装包拖到虚拟机上就好了,如下图(左为xshell,右为xftp):
在这里插入图片描述
现在已经把在本地下载好的redis文件上传到了虚拟机上,然后进行解压和编译

tar -zxvf redis-6.2.6.tar.gz(下载的redis包的名字)
cd redis-6.2.6
make
make install
再查看是否安装成功
cd /usr/local/bin
ls

查看有没有redis文件,如果有说明安装成功了
在这里插入图片描述
以下的文件分别为:
redis-benchmark: 性能测试工具
redis-check-aof: 修复有问题的AOF文件
redis-check-dump: 修复有问题的dump.rdb文件
redis-sentinel: Redis集群使用
redis-server: Redis服务器启动命令
redis-cli: 客户端,操作入口

后台启动Redis

命令如下:

cd /opt (Redis所在文件夹)
ls (查看opt文件夹里的文件)
cd redis-6.2.6 (进入Redis)
ls (查看Redis,里面会有一个redis.conf文件)
cp redis.conf /etc/redis.conf(将redis.conf文件复制到etc的目录下,也叫做redis.conf)
cd /etc(进入/etc目录)
vi redis.conf(更改命令,将daemonize no改为daemonize yes)
:wq!(保存退出)
cd /usr/local/bin
redis-server /etc/redis.conf(启动Redis)
redis-cli (进入客户端)
ps -ef | grep redis(启动之后,查看Redis进程)

Redis关闭

第一种关闭方式:redis-cli shutdowm
第二种关闭方式:ps -ef | grep redis//找到Redis进程
kill -9 redis进程号(直接杀掉redis进程号)

Redis五大数据类型

Redis 键(key)

往key存值语法:set 标识(key) 值(value);
查看往key中存入的值:keys *
exists key: 判断key是否存在,比如:exists 存入的key的名称
type key: 查看存入key的类型,比如:type 存入的key的名称
del key: 删除存入的key,比如:del 存入的key的名称
unlink key: 根据value选择非阻塞删除,真正的删除会在后续异步操作,和上述删除操作同样的效果
expire key 设置的秒数: 给key设置过期时间,比如:expire key 10//设置10秒
ttl key: 查看key还有多少秒过期,-1表示永不过期,-2表示已过期
select: 切换数据库,语法为:select 切换多少库
dbsize: 查看当前数据库的key数量
flushdb: 清空当前库
flushall: 清空所有库(慎用)

Redis 字符串(String)

String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化对象

set key value(存值)
get key(取值)
append < key >< value >: 将给定的< value >追加到原值的末尾
strlen < key >: 获得值的长度
setnx < key >< value >: 只有当key不存在时,才能设置key的值,当key存在时不能设置,即不能替换,也不能覆盖,与set的区别则是set存在和不存在都能设置值
incr < key >: 将key中存储的数据值增加1,只能对数字值操作,如果为空,新增值为1
decr < key >: 将key中存储的数字值减1,只能对数字值操作,如果为空,新增值为-1
incrby / decrby < key > < 增加的值 >: 将key中存储的数字值增减,自定义增加的值
mset < key1 > < value1 > < key2 > < value2 > < key3 > < value3 >… : 同时设置多个key-value对
mget < key1 > < key2 > < key3 >… : 同时获取一个或多个value
msetnx < key1 > < value1 > < key2 > < value2 >… : 同时设置一个或多个key-value对,当且仅当所有给定key都不存在,原子性:有一个失败则都失败
getrang < key > <起始位置> <结束位置>: 获取值的范围,类似于java中的substring,前包,后包
setrange < key > < 起始位置 > < value >: 用< value >覆写< key >所存储的字符串值,从< 起始位置 >开始(索引从0开始)
setex < key > < 过期时间 > < value >: 设置键值的同时,设置过期时间,单位秒
getset < key > < value >: 以新值换旧值

Redis 列表(List)

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

lpush / rpush < key > < value1 > < value2 > < value3 >… : 从左边/右边插入一个或多值
lpop / rpop < key >: 从左边/右边吐出一个值。值在键才会存在,值不在键也没有了
rpoplpush: < key1 > < key2 >从< key1 >列表右边吐出一个值,插到< key2 >左边
lrange < key > < start > < stop >: 按照索引下标获得元素(从左到右)
index < key > < index >: 按照索引下标获得元素(从左到右)
llen < key >: 获得列表长度
linsert < key > before/after < value > < newvalue >: 在< value > 的前面/后面插入< newvalue >的值
**lrem < key > < n > < value >:**从左边删除n个value(从左到右)
lset < key > < index > < value >: 将列表key下标为index的值替换成value

数据结构

List的数据结构为快速链表quickList

Redis 集合(Set)

Redis set 对外提供的功能与List类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择
Set是string类型的无序集合,它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)

常用命令

sadd < key > < value1 > < value2 > … : 将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略
smembers < key >: 取出该集合的所有值
sismember < key > < value > : 判断集合< key >是否含有该< value >值,有则为1,没有为0
scard < key >: 返回该集合的元素个数
srem < key > < value1 > < value2 > … : 删除集合中某个元素
spop < key >: 随机从该集合中吐出一个值
srandmember < key > < n >: 随机从该集合中取出n个值。不会从集合中删除。
smove < source > < destination > value: 把集合中一个值从一个集合转移到另一个集合
sinter < key1 > < key2 >: 返回两个集合的交集元素
sunion < key1 > < key2 >: 返回两个集合的并集元素
sdiff < key1 > < key2 >: 返回两个集合的差集元素(key1中的,不包含key2中的)

数据结构

Set数据结构是dict字典,字典是用哈希表实现的

Redis 哈希(Hash)

Redis hash是一个键值对集合,Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象,类似于Java里面的Map< String , Object>

常用命令

hset < key > < field > < value >: 给 < key >集合中的 < field > 键赋值< value >
hget < key1 > < field >: 从< key1 >集合< field >取出value
hmset < key1 > < field1 > < value > < field2 > < value2 >… : 批量设置hash的值
hexists < key1 > < field >: 查看哈希表key中,给定域field是否存在
hkeys < key >: 列出该hash集合的所有field
hvals < key >: 列出该hash集合的所有value
hincrby < key > < field > < increment >: 为哈希表key中的域field的值加上增量increment
hsetnx < key > < field > < value >: 将哈希表key中的域field的值设置为value,当且仅当域field不存在才能设置

Redis 有序集合Zset(sorted set)

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合

常用命令

zadd < key > < score1 > < value1 > < score2 > < value2 >… : 将一个或多个member与元素及其score值加入到有序集key当中
zrange < key > < start > < stop > [WITHSCORES] : 返回有序集key中,下标在< start > < stop > 之间的元素带WITHSCORES,可以让分数一起和值返回到结果集
zrangebyscore key minmax [withscores] [limit offset count]: 返回有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。有序集成员按score值递增(从小到大)依次排序
zrevrangebyscore key maxmin [withscores] [limit offset count]: 同上,改为从小到大排序。
zincrby < key > < increment > < value >: 为元素的score加上增量
zrem < key > < value >: 删除该集合下,指定值的元素
zcount < key > < min > < max >: 统计该集合,分数区间内的元素个数
zrank < key > < value >: 返回该值在集合中的排名,从0开始

Redis新数据类型(Bitmaps、HyperLogLog、Geospatial)

Jedis操作(利用Java操作Redis,与JDBC操作数据库相似)

首先创建一个maven项目,引入Jedis依赖,如图:
在这里插入图片描述
Jedis依赖如下:

 <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.2.0</version>
 </dependency>

依赖添加完成之后可以测试连接是否成功,测试代码为:

 /*
        创建Jedis对象
         */
        Jedis jedis = new Jedis("120.76.135.172",6379);
        //测试是否连接成功
        String value = jedis.ping();
        System.out.println(value);

在此之前我们还需要更改两个配置,就是bind(添加#号注释)和protected-mode(将yes改为no),进入redis.conf配置文件中找到即可更改(上面步骤有),改完之后要重启redis
在这里插入图片描述
在这里插入图片描述
完成之后可以用代码测试有无连接成功了,如图能输出就是连接成功了(如果没连接成功就是配置文件没更改或者防火墙处于打开状态)
在这里插入图片描述
下面做一个小demo熟悉一下Jedis:

        jedis.set("k1","v1");
        jedis.set("k2","v2");
        jedis.set("k3","v3");
        Set<String> keys = jedis.keys("*");
        System.out.println(keys.size());//输出key的长度
        for (String key : keys){
            System.out.println(key);//打印所有的key值
        }

在这里插入图片描述

Redis 事务

悲观锁: 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block(阻塞),直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在左操作之前先上锁
乐观锁: 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的

Redis 事务三特性
单独的隔离操作: 事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求打断
没有隔离级别的概念: 队列中的命令没有提交之前都不会实际执行,因为事务提交前任何指令都不会被实际执行
不保证原子性: 事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

Redis 主从复制

主机数据更新后根据配置和策略,自动同步到备份机的master/slaver机制,Master(主机)以写为主,Slave(从机)以读为主
用处: 读写分离,性能扩展,容灾快速恢复

扩展知识

Redis缓存穿透

1.应用服务器压力变大(访问量增加)
2.redis命中率降低
3.查询不到数据一直去查询数据库
造成原因:黑客攻击,使用无效的数据对服务器进行访问

解决方案:

1.对空值缓存,设置过期时间,最长不超过五分钟
2.设置可访问的名单(白名单)
3.采用布隆过滤器
4.进行实时监控

Redis缓存击穿

1.数据库访问压力瞬间增加
2.redis里面没有出现大量key过期
3.redis正常运行
造成原因:redis某个key过期了,大量访问使用这个key

解决方案:

1.预先设置热门数据,加大热门key的时长
2.实时调整
3.使用锁,等某个查询成功了在查询,不过效率比较低

Redis缓存雪崩

1.数据库压力变大,服务器崩溃
造成原因:在极少时间段,查询大量key集中过期情况

解决方案:

1.构建多级缓存架构:nginx缓存+redis缓存+其他缓存(ehcache等)
2.使用锁或者队列
3.设置过期标志更新缓存
4.将缓存失效时间分散开

以上就是Redis基础部分了,花了两天差不多了解完了在这里插入图片描述

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 39
    评论
对于学习Redis基础知识,可以按照以下思路进行学习: 1. 了解Redis的概念和特点:首先需要了解Redis是什么,它的主要特点是什么,它为什么被广泛应用于缓存、消息队列、会话管理等场景。 2. 安装和配置Redis:根据你的操作系统,安装Redis并进行相关配置。可以参考Redis官方文档或其他教程来完成这一步。 3. 学习Redis的数据结构:Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。了解每种数据结构的特点、用途和操作命令,并通过实际操作来加深理解。 4. 掌握Redis的常用命令学习Redis的常用命令,如get、set、hget、hset、lpush、lrange、sadd、smembers等,了解每个命令的具体用法和参数含义。 5. 理解Redis的持久化机制:了解Redis的RDB和AOF两种持久化方式,以及它们的优缺点。学习如何进行备份和恢复数据。 6. 学习Redis的事务和Lua脚本:了解Redis事务的基本概念和使用方法,以及如何使用Lua脚本来进行复杂的操作。 7. 深入了解Redis的性能优化和高可用方案:学习如何优化Redis的性能,包括配置调优、使用合适的数据结构、合理地使用缓存等。同时了解Redis的高可用方案,如主从复制、哨兵模式和集群模式。 8. 学习Redis与其他技术的结合:了解Redis如何与其他技术进行结合,如与Python、Java等编程语言的配合使用,以及与Spring、Django等框架的整合。 以上是学习Redis基础知识的一个思路,你可以根据自己的实际情况和需求进行学习和拓展。推荐参考一些经典的Redis教程和实战案例,通过实际操作和项目实践来提升自己的技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值