Redis入门
1.概述
1.1 Nosql
Not-Only sql( 泛指非关系型的数据库),作为关系型数据库的补充。
不依赖业务逻辑方式存储,而以简单的key-value模式存储
- 对数据高并发的读写
- 海量数据的读写
- 高可扩展性
1.2 Redis
Redis--------开源的key-value存储系统
- 支持存储的value类型,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)
- 数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的
- 在此基础上,Redis支持各种不同方式的排序
- 为了保证效率,数据都是缓存在内存中
- Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件
- 并且在此基础上实现了master-slave(主从)同步
应用场景
- 配合关系型数据库做高速缓存
- 高频数据降低IO
- 分布式架构session共享
- 数据结构存储持久化数据
1.3 安装
默认安装目录 /usr/local/bin
- redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何
- redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲
- redis-check-dump:修复有问题的dump.rdb文件
- redis-sentinel:Redis集群使用
- redis-server:Redis服务器启动命令
- redis-cli:客户端,操作入口
启动
用客户端访问:redis-cli
多个端口访问:redis-cli -p端口号
进入终端后再关闭:shutdown
多实例指定端口关闭:redis-cli -p 6379 shutdown
1.4 介绍
Redis是单线程+多路IO复用技术
多路复用:用一个线程来检查多个文件描述符(Socket)的就绪状态
2.数据类型
2.1 Redis键key
- set 设置键 —值
- keys *查看当前库所有key
- exists key判断某个key是否存在
- type key 查看你的key是什么类型
- del key 删除指定的key数据
- unlink key 根据value选择非阻塞删除 仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作
- expire key 10 ( 秒钟)为给定的key设置过期时间
- ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
- select命令切换数据库 0-15
- dbsize查看当前数据库的key的数量
- flushdb清空当前库
- flushall删除全部库
2.2 字符串
Redis最基本的类型
String类型是二进制安全的 --- 可以包含任何数据。比如jpg图片或者序列化的对象
value最多可以是512M
常用命令
- set
添加键值对 - get
查询对应键值 - append
将给定的 追加到原值的末尾 - strlen
获得值的长度 - setnx
只有在 key 不存在时 设置 key 的值 - incr
储存的数字值增1,只能对数字值操作,如果为空,新增值为1 - decr
数字值减1,同上;如果为空,新增值为-1 - incrby / decrby
<步长> 储存的数字值增减自定义步长 - mset
... 同时设置一个或多个 key-value对 - mget
... 同时获取一个或多个 value - msetnx
... - 当且仅当所有给定 key 都不存在
- 原子性,有一个失败则都失败
- getrange
<起始位置><结束位置> 获得值的范围 - setrange
<起始位置> 用 覆写 所储存的字符串值 - setex
<过期时间> 设置键值的同时,设置过期时间,单位秒 - getset
<new_value> 设置了新值同时获得旧值
底层
简单动态字符串
预分配冗余空间的方式来减少内存的频繁分配
2.3 列表
简单的字符串列表,按照插入顺序排序 --- 操作头部或尾部
底层实际是个双向链表,对两端的操作性能很高
常用命令 ---此时key为设置的列表名
- lpush/rpush
.... 从左边/右边插入一个或多个值 - lpop/rpop
从左边/右边吐出一个值 ----key也会删除 - rpoplpush
从 列表右边吐出一个值,插到 列表左边 - lrange
按照索引下标获得元素 (0左边第一个,-1右边第一个) - lindex
按照索引下标获得元素(从左到右) - llen
获得列表长度 - linsert
before 在 的后面插入 插入值 - lrem
从左边删除n个value(从左到右) - lset
将列表key下标为index的值替换成value
底层
- 数据量比较多 ---- 快速链表quickList
- 列表元素较少的情况使用一块连续的内存存储 ---- ziplist压缩列表
- 普通的链表需要的附加指针空间太大,会比较浪费空间
- Redis将链表和ziplist结合起来组成了quicklist --- 快速的插入删除
2.4 集合Set
set是可以自动排重
string类型的无序集合
底层其实是一个value为null的hash表 --- 添加,删除,查找的复杂度都是O(1)
常用命令
- sadd
加入到集合 key 中 重复的元素将被忽略 - smembers
取出该集合的所有值 - sismember
判断集合 是否为含有该 值,有1,没有0 - scard
返回该集合的元素个数 - srem
.... 删除集合中某些元素 - spop
随机从该集合中吐出一个值 - srandmember
随机从该集合中取出n个值----不会从集合中删除 - smove
value把集合中一个值从一个集合移动到另一个集合 - sinter
返回两个集合的交集元素 - sunion
返回两个集合的并集元素 - sdiff
返回两个集合的差集元素(key1中的,不包含key2中的)
底层
Set数据结构是dict字典,字典是用哈希表实现
所有的value都指向同一个内部值
2.5 哈希Hash
string类型的field和value的映射表 ---- 特别适合用于存储对象 ---- Map<String,Object>
例如 使用 ID 为key,映射一个Hash,Hash中储存属性field和value
既不需要重复存储数据,也不会带来序列化和并发修改控制的问题
常用命令
- hset
给 集合中的 键赋值 - hget
从 集合 取出 value - hmset
... 批量设置hash的值 - hexists
查看哈希表 key 中,给定域 field 是否存在 - hkeys
列出该hash集合的所有field - hvals
列出该hash集合的所有value - hincrby
为哈希表 key 中的域 field 的值加上增量 1 -1 - hsetnx
设置哈希表 key 中的field为 value ,当且仅当域 field 不存在时
底层
ziplist(压缩列表),hashtable(哈希表)
当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable
2.6 有序集合Zset
没有重复元素的字符串集合
有序集合的每个成员都关联了一个评分(score)---评分可以是重复
按照从最低分到最高分的方式排序
常用命令
- zadd
… 加入到有序集 key 当中 - zrange
[WITHscoreS] - zrangebyscore key min max [WITHscoreS] [limit offset count]
- zrevrangebyscore key min max [WITHscoreS] [limit offset count]
- 从大到小排列
- zincrby
元素的score加上增量 - zrem
删除该集合下,指定值的元素 - zcount
统计该集合,分数区间内的元素个数 - zrank
返回该值在集合中的排名,从0开始
底层
hash+跳表
- hash的作用就是关联元素value和权重score
- 跳跃表的目的在于给元素value排序
跳表
跳跃表效率堪比红黑树,实现远比红黑树简单
第0层为全表内容,其上层为间隔一定数量的元素连接而成,并能连接到下一层的相同元素;
同理往上可有多层;
查询时先从顶层确定一个大范围,再降到下一层继续寻找更细分的分段;
依次细分,直至到底层定位到具体位置 ---- 类似二分
3.配置文件
3.1 Units 单位
配置大小单位
开头定义了一些基本的度量单位,只支持bytes
大小写不敏感
3.2 INCLUDES 包含
3.3 网络配置
bind
- 默认情况bind=127.0.0.1只能接受本机的访问请求
- 不写的情况下,无限制接受任何ip地址的访问
protect-mode
- 本机访问保护模式设置
- 开启后,没有设置密码时只能本地访问
port
- 端口号 默认 6379
tcp-backlog
- 设置tcp的backlog -----是一个连接队列
- backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列
- 高并发环境下高backlog值来避免慢客户端连接问题
timeout
tcp-keepalive
- 对访问客户端的一种心跳检测,每个n秒检测一次
- 单位为秒,如果设置为0,则不会进行Keepalive检测,建议设置成60
3.4 GENERAL
daemonize
pidfile
loglevel
- 日志记录级别:debug、verbose、notice、warning,默认为notice
- 生产环境选择notice 或者warning
logfile
databases 16
3.5 Security
设置密码----requirepass
3.6 LIMITS
maxclients
maxmemory
- 必须设置------设置redis可以使用的内存量
- 到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定
- 无法移除或设置了“不允许移除”---------返回错误信息-------无内存申请的指令,仍然会正常响应
maxmemory-policy
- volatile-lru:使用LRU算法移除key,只对设置了过期时间的键;(最近最少使用)
- allkeys-lru:在所有集合key中,使用LRU算法移除key
- volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
- allkeys-random:在所有集合key中,移除随机的key
- volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
- noeviction:不进行移除。针对写操作,只是返回错误信息
maxmemory-samples
4.Redis发布和订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
- SUBSCRIBE channel1
- publish channel1 hello
发布的消息没有持久化
5.Redis新数据类型
5.1 Bitmaps
实现对位的操作
实际上它就是字符串---------可以对字符串的位进行操作
每个单元只能存储0和1-----------偏移量
单独提供了一套命令
- setbit
- getbit
获取Bitmaps中某个偏移量的值 - bitcount
[start end] 统计字符串从start字节到end字节比特值为1的数量 - bitop and(or/not/xor)
[key…] 取and交集/or并集/ not非 /xor异或 保存在destkey
5.2 HyberLogLog
Redis HyperLogLog用来做基数统计----------求集合中不重复元素个数
计算基数所需的空间总是固定的、并且是很小的。
每个 HyperLogLog 键只需要花费 12 KB 内存,可以计算接近 2^64 个不同元素的基数。
- pfadd
< element> [element ...] 添加指定元素 ---- 近似基数发生变化,则返回1,否则返回0 - pfcount
[key ...] 计算近似基数 - pfmerge
[sourcekey ...] HLL合并后的结果存储在另一个HLL中
5.3 Geospatial
GEO,Geographic,地理信息的缩写
元素的2维坐标,在地图上就是经纬度
- geoadd
< longitude> [longitude latitude member...] 添加地理位置 - geopos
[member...] 获得指定地区的坐标值 - geodist
[m|km|ft|mi ] 获取两个位置之间的直线距离---指定单位 - georadius
< longitude> radius m|km|ft|mi 以给定的经纬度为中心,找出某一半径内的元素
6.Jedis
引入
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
//IP + 端口号
Jedis jedis = new Jedis("192.168.102.128", 6379);
//测试
String test = jedis.ping();
System.out.println(test);
//操作
Set<String> keys = jedis.keys("*");
keys.forEach(System.out::println);
jedis.set("name", "123");
jedis.get("name");
jedis.close();//关闭连接
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。