本文主要是介绍Redis入门01,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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(主从)同步
应用场景
- 配合关系型数据库做高速缓存
- 数据结构存储持久化数据
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-server
- 后台启动 --- redis-server /home/redis.conf --- 根据配置文件
用客户端访问:redis-cli
多个端口访问:redis-cli -p端口号
单实例关闭:redis-cli shutdown
进入终端后再关闭: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 添加键值对
- key不存在时,可以将key-value添加数据库
- key存在时,可以将key-value添加数据库,与NX参数互斥
- key的超时秒数/毫秒数
- 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]
- 返回有序集 key 中,下标在之间的元素
- WITHSCORES,同时返回分数到结果集
- zrangebyscore key min max [WITHSCORES] [limit offset count]
- 所有 score 值介于 min 和 max 之间(包括等于)
- 按 score 值递增 --- 从小到大
- 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
tcp-backlog
- 设置tcp的backlog -----是一个连接队列
- backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列
- 高并发环境下高backlog值来避免慢客户端连接问题
timeout
- 一个空闲的客户端维持多少秒会关闭,0表示关闭该功能。即永不关闭
tcp-keepalive
- 对访问客户端的一种心跳检测,每个n秒检测一次
- 单位为秒,如果设置为0,则不会进行Keepalive检测,建议设置成60
3.4 GENERAL
daemonize
- 是否为后台进程,设置为yes -----守护进程,后台启动
pidfile
- 存放pid文件的位置 ----- 每个实例会产生一个不同的pid文件
loglevel
- 日志记录级别:debug、verbose、notice、warning,默认为notice
- 生产环境选择notice 或者warning
logfile
databases 16
- 设定库的数量 默认16
- 默认数据库为0号 ------- SELECT 命令
3.5 SECURITY
设置密码----requirepass
- 访问密码的查看、设置和取消
- 在命令中设置密码------临时---------重启redis服务器,密码还原
- 配置文件中进行设置 -------永久设置
3.6 LIMITS
maxclients
- 设置redis同时可以与多少个客户端进行连接
- 默认情况下为10000个客户端 ----超过时拒绝新的连接请求------返回 max number of clients reached
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
- 设置样本数量 --- redis默认会检查这么多个key并根据 LRU 选择
- 一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小
4.Redis发布和订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
Redis 客户端可以订阅任意数量的频道。
- 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();//关闭连接
这篇关于Redis入门01的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!