Redis入门
最新博客:https://codedog.link
课程介绍
NoSQL的概述
什么是NoSQL
- NoSQL = Not Only SQL
- 非关系型数据库
为什么需要NoSQL
- High performance 高并发读写
- Huge Storage 海量数据的高效率存储和访问
- High Scalability &&High Availability 高可扩展性和高可用性
NoSQL数据库的四大分类
- 键值存储
- 列存储
- 文档数据库(典型:mogonDB)
- 图像数据库
NoSQL的特点
- 易扩展
- 灵活的数据模型
- 大数据量,高性能
- 高可用
Redis的概述
高性能键值对数据库,支持的键值数据类型:
- 字符串类型
- 列表类型
- 有序集合类型
- 散列类型
- 集合类型
Redis的应用场景
- 缓存
- 任务队列
- 网站访问统计
- 数据过期处理
- 应用排行榜
- 分布式集群架构中的session分离
Redis的安装和使用
环境:
- VM+CentOS
-
安装步骤:
- 把下载的Redis上传到root目录下,解压,进入解压的目录 使用make命令编译
- 编译完成后使用 make PREFIX=/usr/local/redis install 进行安装,将Redis安装到/usr/local/redis下
- 打开redis目录下是Bin目录,bin目录下有如下可运行脚本
-
Benchmark:性能测试工具、check-aof:aof文件修复工具、
check-dump:IDB检查、check-cli:命令行客户端、check-server:Redis服务启动
-
启动方式:
进入bin目录使用命令"./redis-server"进行启动,默认的启动方式是前台启动,启动后命令行无法再进行其他操作,需要修改redis.conf文件,进入解压目录将redis.conf文件拷贝到安装目录,如下图修改文件中的no为yes
修改完成后使用命令./redis-server ./usr/local/redis/redis.conf 启动(意思是使用conf文件启动)
启动完成后可以使用命令ps -ef | grep -i redis查看
可以使用kill -9 + 2669的方式关闭线程
或者使用 redis-cli shutdown停止服务
-
如何使用:
- 使用./bin/redis-cli命令启动客户端(即连接数据库)
- 可以使用命令Ping测试连接,返回PONG表示连接没有问题
- 使用set存数据
- 使用get取数据
- 使用del删除数据
- 使用keys * 查看所有的key
Jedis的入门
-
Jedis介绍:
- Redis不仅使用命令操作,主流的开发语言都支持客户端的操作,而Jedis是Redis官网首选的Java客户端开发包
-
使用:
- 首先下载Jedis的Jar包和依赖包
- 设置连接的IP和端口号
-
打开Linux防火墙设置(此步不做可能会导致运行时报连接超时错误)
firewall-cmd --zone=public --add-port=6379/tcp --permanent
重启防火墙
systemctl restart firewalld.service
-
同时需要注释掉redis.conf中的bind 127.0.0.1,和把protected-mode设为no
-
单实例测试:
-
l连接池方式连接
Redis的数据类型
-
五中数据类型
- 字符串(String)
- 字符串列表(list)
- 有序字符串集合(sorted set)
- 哈希(hash)
- 字符串集合(set)
-
Key定义的注意点
- 不要过长(1024字节,占用内存)
- 不要过短(降低可读性)
- 统一命名规范
-
存储String
- 二进制安全的,存入和获取的数据相同
- Value最多可以容纳的数据长度是512M
-
存储String常用命令
-
赋值
- Set key value 存一个键值对
-
取值
- Get key 获取key对应的值
- Getset key value 先获取key的值,再把key的值设置成value
-
删除
- Del key 删除对应key和值
-
扩展命令
- Incrby key 将指定Key的value增加指定数字,如果key不存在,将值设置为0并加指定数字,如果value不能转成数字,那么操作会失败,并返回相应的错误信息
- decrby key 将指定Key的value减少指定数字,如果key不存在,将值设置为0并减少指定数字,如果value不能转成数字,那么操作会失败,并返回相应的错误信息
- append key value 在指定Key的value后面追加value字符串,返回的是字符串的长度,如果key不存在,将值设置为指定字符串
-
数值增减
- Incr key 将指定key的value增加1 如果key不存在,将值设置为0并加1,如果value不能转成数字,那么操作会失败,并返回相应的错误信息
- Decr key 将指定key的value减1 如果key不存在,将值设置为0并减1,如果value不能转成数字,那么操作会失败,并返回相应的错误信息
-
-
存储Hash
- String Key和String Value的map容器
- 每个Hash可以存储4294967295个键值对(42亿)
-
存储Hash常用命令
-
赋值
-
hset key field value
- 例:hset myhash username jack
-
Hmset
- 例: hmset myhash2 username rose age 21
-
-
删除
- Hdel key field1 field2(删除对应对象的多个属性,删除以后再次删除会返回0)
- Del key (删除整个对象)
-
-
取值
- Hget key field(要取的对象 对象的属性)
- Hmget key field field..(要取的对象,属性1,属性2.。。)
- Hgetall key(取得对应key的所有属性)
-
增加数字
- Hincrby key field value
-
自学命令
-
Hexists key field(判断指定key中的属性是否存在存在返回1,不存在返回0)
-
Hlen key (得到key中有几个属性)
-
Hkeys key(得到key中所有的属性的名称)
-
Hvals key(得到key中所有属性的值)
-
-
存储list
- 在redis中list类型是按照插入顺序排序的字符串链表,和数据结构中的普通链表一致
- ArrayList使用数组方式存储数据(查询较快,新增和删除较慢)
- LinkList使用双向链表方式存储数据(插入和删除速度较快)
- 双向链表中增加数据
- 双向链表中删除数据
-
存储list常用命令:
-
两端添加
- (从左侧增加值)Lpush key value1 value2
- (从右侧增加值)rpush key value1 value2
-
查看列表
- Lrange key start stop(开始下标,结束下标 注意负数)
-
两端弹出
- Lpop key (弹出指定key中头部的元素)
-
Rpop key(弹出指定key中尾部的元素)
-
获取列表元素个数
-
Len key
-
-
扩展命令
-
Lpushx key (当指定的key存在时候,则可以向这个Key的头部插入一个指定的值)
-
Rpushx key (当指定的key存在时候,则可以向这个Key的尾部插入一个指定的值)
- Lrem key count value (count:要删除几个指定的值,value:指定要删的值,如下图,从头到尾删除两个3)
- 从尾部往头部删除两个1
- 删除key里面所有的2
- 修改指定下标的value
- 在某一个元素前插入一个元素
- 在某一个元素之后插入一个元素
- 将链表中的尾部元素弹出,并添加到另一个链表的头部
-
-
-
存储Set
- 和List不同,set集合中不允许出现重复的元素
- 每个Set可包含的最大元素数量是4294967295
-
常用命令
-
添加/删除元素
-
Sadd key value1 value2 添加
-
Srem key value1 value2删除
-
-
获得集合中的元素
-
Smembers key
-
-
-
集合中的差集运算
-
Sdiff key1 key2
-
-
集合中的交集运算
-
Sinter key1 key2
-
-
集合中的并集运算
-
Sunion key1 key2
-
-
扩展命令
-
Sismember key value判断set中有没有指定元素存在返回1,不存在返回0
-
Scard key获得set中成员的数量
-
Srandmember key随机返回set中的一个成员
-
Sdiffstore key v1 v2将两个集合v1 v2相差的成员存储到集合key中
-
Sinterstore key v1 v2求两个集合v1 v2的交集并存到一个集合key中
-
Sunionstore key v1 v2将两个集v1 v2的并集存到一个集合Key中
-
-
存储sorted-sed
-
Sorted-set和set的区别
-
添加元素
- Zadd key 分数-value 如果value在集合中已经存在 则会使用新的分数替换旧的分数但是返回个数为0
-
获得元素
- 可以获得成员中的数量或者成员对应的分数
-
获得分数:zscore
-
获得 成员数量
-
删除元素
-
Zrem key value
-
-
范围查询
-
Zrange key starp stop
-
显示分数(从小到大)
-
从大到小
-
zremrangebyrank按照排名的范围删除
-
zremrangebyscore key min max按照分数范围删除
-
-
扩展命令
-
ZRANGEbyscore key min max返回分数区间内的所有元素
-
Zincrby key value 元素 设置指定成员分数增加
-
Zcount key min max查看指定分数的元素有几个
-
-
-
-
使用场景:
- 大型在线游戏积分排行榜
- 构建索引数据
Keys的通用操作
Keys * 查看所有的key
Keys my? 查看所有以my开头的key
Del key1 key2 key3 删除指定Key
Exists key 某一个Key是否存在 存在1 不存在0
Rename keyname newkeyname 给指定的key换名字
Expire key m 给指定key设置过期时间 单位s
Ttl key 查看key所剩超时时间
Type key 查看key类型
Flushall 清空数据库
Redis的特性
-
多数据库
- 一共有16个数据库从0-15 客户端默认连接0数据库
- 可以通过select index 来选择连接数据库
-
Redis事务
- Multi 开启一个事务
- exec 提交
- Discard 回滚
Redis的持久化
-
RDB方式
- 在指定的时间间隔内,将内存中的数据集快照,写入到磁盘
-
优势:
- 整个redis数据库只包含一个文件,对于文件备份很友好
- 对于灾难恢复,由于只有一个文件,可以很方便的压缩转移
- 性能最大化,对比AOF,如果数据量很大,RDB的效率会更高
-
劣势:
- 如果想保证数据的高可用性,即最大限度避免数据丢失,RDB就不是一个好的选择,如果数据在持久化之前发生宕机,数据可能会丢失
- 数据集非常大的情况下,由于是子线程进行操作,可能会导致服务器停止几百毫秒到一秒
-
配置:
- Redis.conf文件中如下的配置
- 第一行指的是:每900秒至少有一个Key发生变化,就会持久化一次
- 第二行指的是:每300秒至少有十个key发生变化,就会往硬盘上写一次
- 第三行指的是:每60秒至少有一万个Key发生变化,就会往硬盘上写一次
- 默认保存的文件名:
- 默认的保存路径
-
AOF方式
- 将以日志的形式记录服务器的每一步操作,在redis服务器启动之初,会读取该文件来重新构建数据库
-
优势:
- 可以带来更高的数据安全性
- 提供三种策略:每秒同步(异步,效率高)、每修改同步(每次修改都会被立即记录,效率低,安全)、不同步
- 对于日志使用的是追加模式,即使服务器宕机也不会破坏日志文件中存在的内容
- 如果日志过大,redis可以启动自动重写机制
-
劣势:
- 对于相同数量的数据集,AOF文件要比RDB文件大
- 效率上会低于RDB
-
配置:
- 默认aof方式没有打开 ,需要把上图的no改为yes,打开后默认文件名:
- 同步方式: