Redis初体验
Updated:
			文章目录
		
		
		
		NoSQL概述
- 什么是NoSQL?- NoSQL == Not Only sql && NoSQL != No sql
- 也就是所谓的非关系型数据库啦
 
- 为啥需要NoSQL?- 因为!随着互联网的发展,非关系型数据库比关系型数据库更能满足下列需求 :- 高并发读写需求
- 海量数据的高效率存储与访问
- 高可扩展性与高可用性
 
- 详见 –> 关不关系型数据库.md
 
- 因为!随着互联网的发展,非关系型数据库比关系型数据库更能满足下列需求 :
- NoSQL数据库的四大分类 :- 键值存储- 优 :快速查询
- 劣 :存储的数据缺失结构化
 
- 列存储- 优 :查询速度快、可扩展性强
- 劣 :功能相对局限
 
- 文档数据库- MongoDB
- 优 :对数据结构要求不太严格
- 劣 :查询性能一般、缺少统一语法
 
- 图形数据库- 优 :利用图结构的算法
- 劣 :需要对整个图做计算才能得出结果
 
- 最后放张对比图 : 
 
- 键值存储
- NoSQL的特点 :- 易扩展(因为摒弃了数据之间粘连)
- 数据模型灵活(比如说不用提前建好字段)
- 大量数据、高性能
- 高可用
 
Redis概述
- Redis是什么?- Redis是一种
- 高性能
- 键值对
- 数据库
 
- Redis支持的键值数据类型有哪些?- 字符串类型(String)
- 散列类型(Hash)- 即 key(键)-field(属性)-value(属性值) 模式,详见:
 https://blog.csdn.net/Y2701310012/article/details/40870543
 
- 即 key(键)-field(属性)-value(属性值) 模式,详见:
- 列表类型(List)
- 集合类型(Set)- 相当于一个不能出现重复元素的list
 
- 有序集合类型(Sorted Set / zset)- 相当于一个给每个元素打上分的set
 
 
- Redis的应用场景- 缓存
- 任务队列
- 网站访问统计
- 数据过期处理
- 应用排行榜
- 分布式集群架构中的session分离
 
Redis的下载与安装
- 首先让我们来看一下怎么安装- 注意是在Linux环境下嗷 然后就这样跟着做就好啦 φ(>ω<*) 
- 安装 
 
- 注意是在Linux环境下嗷 然后就这样跟着做就好啦 φ(>ω<*)
- 然后要怎么启动呢?- 进入到我们指定的目录下的redis目录里面 
- 会发现有一个bin文件(用来存放可执行命令),进入它 
- 回到家目录,进入解压后的文件,找到redis.conf 
- 将它拷贝到安装目录下 : 
- 然后就配置成功啦 让我们启动一下 : 
 
- 进入到我们指定的目录下的redis目录里面
- 但是!这样子前端启动(好像是这么叫?)的话,就不能做其他操作了!超级不方便,所以我们最好采用另一种方式 :后端启动(好像- 进入redis.conf,找到这一行,然后把原本的no改为yes 
- 然后就完成啦!再启动一下(注意要让它在前端启动的基础上加载配置文件,也就是后面跟的那点): 
- 最后确认一下,就可以看到它已经成功在后台启动啦 : 
 
- 进入redis.conf,找到这一行,然后把原本的no改为yes
- 那么问题来了,我们要怎么停止它呢?- 像这样,进入bin目录下的客户端(redis-cli),shutdown它,再检查一下,就会发现这个进程已经不存在啦 
 
- 像这样,进入bin目录下的客户端(redis-cli),shutdown它,再检查一下,就会发现这个进程已经不存在啦
Jedis的使用
- 首先确认一下它是能用的 :- 后台启动redis后,进入bin下的客户端,给它发个ping的消息;客户端回个PONG,就说明连接正常,可以使用啦 φ(>ω<*) 
 
- 后台启动redis后,进入bin下的客户端,给它发个ping的消息;客户端回个PONG,就说明连接正常,可以使用啦 φ(>ω<*)
- 写 - (照搬)个小demo试验一下- 比如说这样写 :1 
 2
 3
 4
 5
 6
 7
 8
 9// 设置IP地址和端口号 
 Jedis jedis = new Jedis("192.168.43.163",6379);
 // 保存数据
 jedis.set("name","kangna");
 // 获取数据
 String valueOfName = jedis.get("name");
 System.out.println( "valueOfName = " + valueOfName);
 // 释放资源
 jedis.close();
 
- 比如说这样写 :
- 然后试着用idea连一下: - 首先vim /etc/sysconfig/iptables 设置一下防火墙 
- 进来之后找到上面那行,yy(复制) + p(粘贴),改一下端口号 
- 然后重启我们的防火墙 
- 但是还是报错了!为什么呢为什么呢? 
 
- 首先vim /etc/sysconfig/iptables 设置一下防火墙
- 好像是说redis默认只能localhost登录,所以需要开启远程登录 :- 将proteced-mode(保护模式)设置为no 
- 然后注释掉 bind 127.0.0.1 这行 
- 最后重启redis,然后回idea运行一下,就可以看见我们的老婆了! 
 
- 将proteced-mode(保护模式)设置为no
- 那那那能不能用连接池呢?当然是可以的!- 就直接这样子 :1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28// 获取连接池配置对象 
 JedisPoolConfig poolConfig = new JedisPoolConfig();
 // 然后设置一下,比如最大连接数、最大空闲连接数什么的
 poolConfig.setMaxTotal(20);
 poolConfig.setMaxIdle(10);
 // 获取连接池
 JedisPool jedisPool = new JedisPool(poolConfig,"192.168.43.163",6379);
 // 获取Jedis对象
 Jedis jedis = null;
 try {
 // 通过连接池获取连接
 jedis = jedisPool.getResource();
 // 然后就是各种操作啦
 } catch (Exception e) {
 e.printStackTrace();
 } finally {
 // 最后关闭资源
 if(jedis != null) {
 jedis.close();
 }
 if(jedisPool != null) {
 jedisPool.close();
 }
 }
 
- 就直接这样子 :
Redis的数据结构
- 字符串(String)常用命令 :- set [key] [value]- 设置指定key的值 
 
- 设置指定key的值
- get [key]- 获取指定key的值 
 
- 获取指定key的值
- getset [key] [value]- 将给定key的值设为value,并返回之前的值 
- 注 :用set直接改值的话,返回的是OK 
 
- 将给定key的值设为value,并返回之前的值
- setnx [key] [value]- 只在key不存在的时候设置key的值 
 
- 只在key不存在的时候设置key的值
- getrange [key] [start] [end]- 返回字符串值中的子字符串 
 
- 返回字符串值中的子字符串
- mget [key1] [key2] […]- 一次获取多个key的值(不存在的话就返回nil(相当于null)嘛) 
 
- 一次获取多个key的值(不存在的话就返回nil(相当于null)嘛)
- mset [key1] [value1] [key2] [value2] […] […]- 同时设置多个键值对 
 
- 同时设置多个键值对
- del [key] / del [key1] [key2] […]- 删除单个或多个键值对,直接在后面跟要删的key就好啦 
- 回注 :del感觉超级强大好像每个类型的都能删诶.. 
 
- 删除单个或多个键值对,直接在后面跟要删的key就好啦
- incr/decr [key]- 将key中储存的数字值+1 
 
- 将key中储存的数字值+1
- incrby/decrby [key] [increment]- 将key中所储存的数字值加上给定值 
 
- 将key中所储存的数字值加上给定值
- incrbyfloat [key] [increment]- 将key中所储存的数字值加上给定浮点数值 
- 注 :浮点数要减的话,就直接加一个负的,比如这样 : 
 
- 将key中所储存的数字值加上给定浮点数值
- append [key] [append-value]- 在key中所储存的字符串末尾追加一个新字符串 
- 注 :最好用双引号括起来,不然会连在一起的!
 
- 在key中所储存的字符串末尾追加一个新字符串
 
- set [key] [value]
- 哈希(hash)常用命令 :- hset [key] [field] [value]- 设置指定key中指定field(属性)的值 
 
- 设置指定key中指定field(属性)的值
- hmset [key] [field1] [value1] [field2] [value2] […]- 一次为指定key中多个属性设置对应的值 
 
- 一次为指定key中多个属性设置对应的值
- hget [key] [field]- 获取指定key中某一属性的值 
 
- 获取指定key中某一属性的值
- hmget [key] [filed1] [field2] […]- 获取指定key中多个属性的值 
 
- 获取指定key中多个属性的值
- hgetall [key]- 获取指定key中各个属性即其对应值 
 
- 获取指定key中各个属性即其对应值
- hdel [key] [field1] [field2] […]- 删除指定key中一个或多个属性  
 
- 删除指定key中一个或多个属性
- del [key1] [key2] […]- 直接删除指定的一个或多个key  
 
- 直接删除指定的一个或多个key
- hincrby [key] [field] [increment]- 将key中存储的数字加上给定值 
 
- 将key中存储的数字加上给定值
- hexists [key] [field]- 判断指定key中某个属性是否存在 
 
- 判断指定key中某个属性是否存在
- hlen [key]- 获取指定key中的全部属性的数量 
 
- 获取指定key中的全部属性的数量
- hkeys [key]- 获取指定key中的各个属性 
 
- 获取指定key中的各个属性
- hvals [key]- 获取指定key中各个属性的值 
 
- 获取指定key中各个属性的值
 
- hset [key] [field] [value]
- 字符串列表(list)常用命令 :- lpush/rpush [list] [arg1] [arg2] […]- 从左边/右边向链表中添加元素 
- 注 :是从左边添加,不是从左向右添加;从右边同理
 
- 从左边/右边向链表中添加元素
- lrange [list] [start] [end]- 查看列表中从start到end的元素 
- 注 :如果想查看所有元素,用0到-1就可以了
 
- 查看列表中从start到end的元素
- lpop/rpop [list]- 弹出该链表左边/右边的第一个元素(弹出了就没有了) 
 
- 弹出该链表左边/右边的第一个元素(弹出了就没有了)
- llen [list]- 返回指定list中的元素个数 
 
- 返回指定list中的元素个数
- lpushx/rpushx [list] [arg]- 向该链表左端/右端插入指定元素 
 
- 向该链表左端/右端插入指定元素
- lrem [list] 0 [arg]- 删除该链表中的所有指定元素 
 
- 删除该链表中的所有指定元素
- lset [list] [index] [arg]- 将list中某一角标的值改写为指定值 
 
- 将list中某一角标的值改写为指定值
- linsert [list] before/after [arg] [inserted-arg]- 在list中的第一个指定元素之前/后插入某一元素 
 
- 在list中的第一个指定元素之前/后插入某一元素
- rpoplpush [list1] [list2]- 将list1的右边元素弹出,并压入到list2的左边 
 
- 将list1的右边元素弹出,并压入到list2的左边
 
- lpush/rpush [list] [arg1] [arg2] […]
- 字符串集合(set)常用命令 :- sadd [set] [arg1] [arg2] […]- 向集合中添加元素 
- 注 :重复的元素是加不进去的!比如这样 : 
 
- 向集合中添加元素
- srem [set] [arg1] [arg2] […]- 删除集合中的一个或多个元素 
 
- 删除集合中的一个或多个元素
- smembers [set]- 查看该集合中的全部元素 
 
- 查看该集合中的全部元素
- sismember [set] [arg]- 判断某个元素是否在该集合中 
 
- 判断某个元素是否在该集合中
- sdiff [set1] [set2]- 返回给定集合之间的差集(与给定顺序相关) 
- 注 :准确来说是返回”在前一个set中存在,但在后一个set中不存在”的元素 : 
 
- 返回给定集合之间的差集(与给定顺序相关)
- sinter [set1] [set2]- 返回给定集合之间的交集(与给定顺序无关) 
 
- 返回给定集合之间的交集(与给定顺序无关)
- sunion [set1] [set2]- 返回给定集合之间的并集(与给定顺序稍微有关) 
 
- 返回给定集合之间的并集(与给定顺序稍微有关)
- sdiffstore/sinterstore/sunionstore [newSet] [set1] [set2]- 将给定集合之间的差集/交集/并集存入一个新的集合 
 
- 将给定集合之间的差集/交集/并集存入一个新的集合
- scard [set]- 返回给定集合中的元素个数 
 
- 返回给定集合中的元素个数
- srandmember [set]- 随机返回一个给定集合中的元素 
 
- 随机返回一个给定集合中的元素
 
- sadd [set] [arg1] [arg2] […]
- 有序字符串集合(sorted set)常用命令 :- zadd [zset] [score1] [arg1] [score2] [arg2] […]- 向指定集合中添加元素 
- 注 :如果添加已存在的元素,会直接覆盖,并且返回0 
 
- 向指定集合中添加元素
- zscore [zset] [arg]- 返回指定集合中某个元素对应的分数 
 
- 返回指定集合中某个元素对应的分数
- zcard [zset]- 返回指定集合中的元素个数 
 
- 返回指定集合中的元素个数
- zrem [zset] [arg1] [arg2] […]- 移除指定集合中的一个或多个元素 
 
- 移除指定集合中的一个或多个元素
- zrange [zset] [start] [end] (withscores)- 按分数排序(默认从小到大)返回指定集合中从start到end的元素 
- 注 :如果用zrevrange的话就是从大到小排序 
 
- 按分数排序(默认从小到大)返回指定集合中从start到end的元素
- zremrangebyrank [zset] [start] [end]- 删除指定集合中按分数排序后从start到end的元素 
 
- 删除指定集合中按分数排序后从start到end的元素
- zremrangebyscore [zset] [min] [max]- 删除指定集合中分数在min到max区间内的元素 
 
- 删除指定集合中分数在min到max区间内的元素
- zrangebyscore [zset] [min] [max] (withscores) (limit [offset] [count])- 返回指定集合中,分数在min到max区间内的元素 
- 注 :limit表示从offset开始,往后取count个元素(类似于sql语句里面分页的那个limit) 
 
- 返回指定集合中,分数在min到max区间内的元素
- zincrby [zset] [increment] [arg]- 为集合中的指定元素增减分数 
 
- 为集合中的指定元素增减分数
- zcount [zset] [min] [max]- 返回该集合中指定区间内的元素个数 
 
- 返回该集合中指定区间内的元素个数
 
- zadd [zset] [score1] [arg1] [score2] [arg2] […]
Redis中keys的通用操作
- 常用命令如下 :- keys [通配符]- 返回符合条件的所有keys 
 
- 返回符合条件的所有keys
- del [key1] [key2] […]- 删除指定的一个或多个key 
 
- 删除指定的一个或多个key
- rename [key-name] [key-newName]- 重命名这个key 
 
- 重命名这个key
- type [key]- 得到这个key的类型 
 
- 得到这个key的类型
 
- keys [通配符]
Redis特性
- 多数据库
- 事务
Redis持久化
- 持久化 :- 将数据从内存同步到硬盘上的过程
 
- RDB(默认) :- 每经过指定时间就写入一次
 
- AOF :- 将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令都执行一遍
 
- 为什么写的这么敷衍 :- 因为仙女学不动了(望天