irpas技术客

Redis基础——安装与基础命令的学习_爱敲代码的杜晓帅~

网络投稿 8395

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://·/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基础部分了,花了两天差不多了解完了


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #not #only #SQL