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 :
- 将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令都执行一遍
- 为什么写的这么敷衍 :
- 因为仙女学不动了(望天