권장(무료): redis
1 Redis 소개
Redis란 무엇입니까
Redis는 완전히 오픈 소스이며 무료이며 BSD 프로토콜을 준수하며 성능(NOSQL)입니다. ) 키-값 데이터베이스 . Redis는 ANSI C 언어로 작성된 오픈소스 로그형 Key-Value 데이터베이스로, 네트워크를 지원하고, 메모리 기반 및 영속성이 가능하며, 다국어로 API를 제공합니다.
BSD是“Berkeley Software Distribution”的缩写,意思是“伯克利软件发⾏版”。 BSD开源协议是⼀个给与使⽤者很⼤⾃由的协议。可以⾃由的使⽤,修改源代码,也可以将修改后的代码作 为开源或者专有软件再发布。 BSD由于允许使⽤者修改或者重新发布代码,也允许使⽤或在BSD代码上开发商业软件发布和销售,因此是 对商业集成很友好的协议。 Linux:Ubuntu Redhat Centos
Nosql :
Nosql, 泛指⾮关系型数据库,Nosql即Not-only SQL,他作为关系型数据库的良好补充。随着互联⽹的 兴起,⾮关系型数据库现在成为了⼀个极其热⻔的新领域,⾮关系型数据库产品的发展⾮常迅速
2 Redis 설치
2.1 설치 전 준비
Redis 공식 홈페이지 : http://redis.io 공식 홈페이지 : http://redis.io : //redis .cn
공식 홈페이지 다운로드: http://redis.io/download
Redis 설치
Linux Redis는 C 언어로 개발되었으며, Redis를 설치하려면 먼저 공식 홈페이지에서 소스 코드를 다운로드해야 합니다. 컴파일, 컴파일은 GCC 환경에 따라 다릅니다. GCC 환경이 없으면 GCC
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz $ tar xzf redis-5.0.5.tar.gz $ cd redis-5.0.5$ make
Windows
직접 압축을 풀어야 합니다 Redis 설치 디렉터리를 환경 변수에 추가하는 것이 좋습니다
2.2 Redis 시작
Linux Redis 서버 시작
해당 설치 디렉터리 입력
cd /usr/local/redis
./bin/redis-server
Linux Redis 클라이언트 시작
./bin/redis-cli
해당 설치 항목 입력 ⽬로그, 명령 창 열기 ⼝ 명령 실행
redis-server redis.window.conf
Windows에서 Redis 클라이언트 시작
해당 설치 디렉터리 입력, 명령 창 열기 ⼝ 명령 실행
redis-cli
클라이언트가 성공적으로 시작된 후 그림:
3 Redis 코어 구성 파일 Redis.conf
*1. Redis 默认不是以守护进程的⽅式运⾏,可以通过该配置项修改,使⽤yes启动守护进程 daemonize no2. 当客户端闲置多⻓时间后关闭连接(单位是秒) timeout 300*3. 指定Redis监听端⼝,默认端⼝为6379,作者在⼀⽚博⽂中解释了为什么选⽤6379作为默认端⼝,因 为6379在⼿机按键上MERZ对应的号码,⽽MERZ取⾃意⼤利歌⼿Alessia Merz的名字 port 6379*4. 绑定的主机地址 bind 127.0.0.1 5. 指定⽇志记录级别,Redis共⽀持四个级别:debug、verbose、notice、warning loglevel verbose6. 数据库数量(单机环境下),默认数据库为0,可以使⽤select <dbid>命令在连接上指定数据库id databases 16// ⾮常重要*7. RDB 持久化策略,指定在多⻓时间内,有多少次更新操作,就将数据同步到数据⽂件,可以多个条件 配合 save <seconds> <changes> Redis默认配置⽂件提供了三个条件 save 900 1 save 300 10 save 60 100008. 持久化⽂件名 dbfilename dump.rdb*9. 指定存储⾄本地数据库时是否压缩数据,默认为yes,Redis采⽤LZF(压缩算法)压缩,如果为了节 省CPU时间,可以关闭该选项,但会导致数据库⽂件变得巨⼤ rdbcompression yes*10. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis的时候需要通过 AUTH<password> 命令提供密码,默认关闭 requirepass foobared// AOF 配置*11. 指定是否在每次操作后进⾏⽇志记录,Redis在默认情况下是关闭的 appendonly no*12. AOF⽂件的名字 appendfilename "appendonly.aof"*13. aof策略,分为三种,always表示每次操作都会记录⽇志,everysec表示每秒记录⼀次⽇志,no表 示不记录⽇志 # appendfsync always appendfsync everysec # appendfsync no</password></changes></seconds></dbid>
RDB: Redis의 기본 지속성 메커니즘입니다. RDB는 상태를 저장하는 스냅샷을 만드는 것과 같습니다. ⼏⼼10GB data------> ⼏KB
snapshotSnapshot은 메모리에 있는 데이터를 준비된 파일에 바이너리로 쓰는 방식입니다. 기본 파일 이름은 dump.rdb입니다.
재해 복구 및 백업에 적합합니다.단점: RDB 메커니즘이 요구 사항을 충족하는 경우 메모리 머신이 사용하기에 적합하지 않습니다. Lost
Snapshots 조건:
aof 지속성 방법을 사용할 때 redis가 쓰기 기능을 통해 수신된 모든 쓰기 명령을 파일에 추가하기 때문에 스냅샷 방법보다 더 나은 지속성을 갖습니다. . Redis가 재시작되면 파일에 저장된
write 명령을 실행하여 전체 데이터베이스의 내용을 메모리에 재구성합니다.
다음과 같은 세 가지 방법이 있습니다: (기본값은 초당 1회) appendonly yes는 지속성 모드를 활성화합니다. appendsync는 항상 쓰기 명령을 받은 후 즉시 디스크에 씁니다. 가장 느리지만 완전한 지속성을 보장합니다. appendsync는 디스크에 씁니다. 초당 한 번, 성능과 지속성 사이에서 적절한 절충안을 만듭니다.
appendsync no는 OS에 전적으로 의존하고 최고의 성능을 가지며 지속성은 보장되지 않습니다.4 Redis 일반 데이터 유형 및 애플리케이션 시나리오
Redis는 5가지 데이터 유형을 지원합니다. String(문자열), hash(해시), list(목록), set(집합) 및 zset(sorted set: 순서가 지정된 집합) 등
4.1 String
string은 Redis의 가장 기본적인 유형의 One Key입니다. 하나의 값에 해당하며, 하나의 키는 최대 512MB까지 저장할 수 있습니다.
문자열 유형은 바이너리 안전합니다. 이는 Redis 문자열에 모든 데이터가 포함될 수 있음을 의미합니다. jpg 이미지나 직렬화된 객체 등. ⼼바이너리 보안이란 데이터를 전송할 때 바이너리 데이터의 정보 보안을 보장하는 것을 의미합니다. 즉, 변조, 해독 등이 되지 않습니다. 공격을 받으면 적시에 탐지할 수 있습니다
이전 맵과 동일⾮ 매우 유사합니다. 값은 문자열입니다.
SET key value GET key INCR 可以对应的key的数值(整型的数值)加⼀( 原⼦操作)INCRBY 给数值加上⼀个步⻓ SETEX expire 过期 SETNX not exist key不存在的时候再去赋值
응용 시나리오: 매우 일반적인 시나리오는 웹사이트 방문 pv(페이지 보기) 수, 현재 온라인에 있는 사람 수 등을 계산하는 데 사용됩니다. incr 명령(++ 연산)
4.2 List
Redis的列表允许⽤户从序列的两端推⼊或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构,所以向列表两端添加元素的时间复杂度为o(1),获取越接近两端的元素速度就越快。这意味着即使是⼀个有⼏千万个元素的列表,获取头部或尾部的10条记录也是极快的。List中可以包含的最⼤元素数量是4294967295。
操作命令: LPUSH 后⾯的元素放在栈顶 LPOP 返回第⼀个元素,并且在列表上删除该元素 (栈顶) LLEN 返回当前的list列表的⻓度 LINDEX 返回当前的list的指定index下标的元素。没有返回nil,0表示栈顶的元素 LINSERT 插⼊的位置是按照index的顺序,Before的话得注意 index的值 LPUSHX 如果list存在,再去push LRANGE 可以⽅便的查看某个index范围内的list的值。输⼊的index是从0开始,显示的标号是从1开始的。 LREM 删除list⾥的指定的前⼏个(指定value的)元素 删除指定位置的元素:没有 LSET 设置指定的位置的元素的值 (修改) 输⼊的index是从0开始,显示的标号是从1开始的。
应⽤场景:1.最新消息排⾏榜。2.消息队列,以完成多程序之间的消息交换。可以⽤push操作将任务存
在list中(⽣产者),然后线程在⽤pop操作将任务取出进⾏执⾏。(消费者)
4.3 Hash (⼆维表)
Redis中的散列可以看成具有String key和String value的map容器,可以将多个key-value存储到⼀个key中。每⼀个Hash可以存储4294967295个键值对。
HSET HSET key field value 将哈希表 key 中的域 field 的值设为 value 。 如果 key 不存在,⼀个新的哈希表被创建并进⾏ HSET 操作。 如果域 field 已经存在于哈希表中,旧值将被覆盖。 HGET 返回哈希表 key 中给定域 field 的值。如果不存在,返回nil HEXISTS HEXISTS key field 查看哈希表 key 中,给定域 field 是否存在。 HGETALL HGETALL key 返回哈希表 key 中,所有的域和值。 在返回值⾥,紧跟每个域名(field name)之后是域的值(value),所以返回值的⻓度是哈希表⼤⼩的 两倍。 HKEYS HKEYS key 返回哈希表 key 中的所有值。 HLEN 返回哈希表 key 中值的数量。 HVALS HVALS key 返回哈希表 key 中所有域的值。 HINCRBY HINCRBY key field increment 为哈希表 key 中的域 field 的值加上增量 increment 。 增量也可以为负数,相当于对给定域进⾏减法操作。 如果 key 不存在,⼀个新的哈希表被创建并执⾏ HINCRBY 命令。 如果域 field 不存在,那么在执⾏命令前,域的值被初始化为 0 。 对⼀个储存字符串值的域 field 执⾏ HINCRBY 命令将造成⼀个错误。 本操作的值被限制在 64 位(bit)有符号数字表示之内。 HMGET HMGET key field [field ...]返回哈希表 key 中,⼀个或多个给定域的值。 如果给定的域不存在于哈希表,那么返回⼀个 nil 值。 因为不存在的 key 被当作⼀个空哈希表来处理,所以对⼀个不存在的 key 进⾏ HMGET 操作将 返回⼀个只带有 nil 值的表。 HMSET HMSET key field value [field value ...]同时将多个 field-value (域-值)对设置到哈希表 key 中。 此命令会覆盖哈希表中已存在的域。 如果 key 不存在,⼀个空哈希表被创建并执⾏ HMSET 操作。 HSETNX HSETNX key field value 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。 若域 field 已经存在,该操作⽆效。 如果 key 不存在,⼀个新哈希表被创建并执⾏ HSETNX 命令。
应⽤场景:例如存储、读取、修改⽤户属性(name,age,pwd等)
4.4 Set(⽆序集合)
SADD SADD key member [member ...]将⼀个或多个 member 元素加⼊到集合 key 当中,已经存在于集合的 member 元素将被忽略。 假如 key 不存在,则创建⼀个只包含 member 元素作成员的集合。 当 key 不是集合类型时,返回⼀个错误。 SMEMBERS SMEMBERS key 返回集合 key 中的所有成员。 不存在的 key 被视为空集合。 SISMEMBER SISMEMBER key member 判断 member 元素是否集合 key 的成员。 SCARD SCARD key 返回集合 key 的基数(集合中元素的数量)。 SPOP (弹出并从集合删除) SPOP key 移除并返回集合中的⼀个随机元素。 如果只想获取⼀个随机元素,但不想该元素从集合中被移除的话,可以使⽤ SRANDMEMBER 命 令。 SRANDMEMBER SRANDMEMBER key [count]如果命令执⾏时,只提供了 key 参数,那么返回集合中的⼀个随机元素。 随机取出 count个元素(不删除) SINTER SINTER key [key ...]返回⼀个集合的全部成员,该集合是所有给定集合的交集。 不存在的 key 被视为空集。 SINTERSTORE SINTERSTORE destination key [key ...]这个命令类似于 SINTER 命令,但它将结果保存到 destination 集合,⽽不是简单地返回结果 集。 如果 destination 集合已经存在,则将其覆盖。 SUNION SUNION key [key ...]返回⼀个集合的全部成员,该集合是所有给定集合的并集。 不存在的 key 被视为空集。 SUNIONSTORE SUNIONSTORE destination key [key ...]这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,⽽不是简单地返回结果 集。 如果 destination 已经存在,则将其覆盖。 SDIFF SDIFF key [key ...]返回⼀个集合的全部成员,该集合是所有给定集合之间的差集。 不存在的 key 被视为空集。 SDIFFSTORE SDIFFSTORE destination key [key ...]这个命令的作⽤和 SDIFF 类似,但它将结果保存到 destination 集合,⽽不是简单地返回结果 集。 如果 destination 集合已经存在,则将其覆盖。 destination 可以是 key 本身。 SMOVE SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合。SMOVE 是原⼦性操作。 SREM 删除 SREM key member [member ...]移除集合 key 中的⼀个或多个 member 元素,不存在的 member 元素会被忽略。 当 key 不是集合类型,返回⼀个错误。
应⽤场景:
1.利⽤交集求共同好友。
2.利⽤唯⼀性,可以统计访问⽹站的所有独⽴IP。
3.好友推荐的时候根据tag求交集,⼤于某个threshold(临界值的)就可以推荐。
4.5 SortSet(有序集合)
ZADD ZADD key score member [[score member] [score member] ...]将⼀个或多个 member 元素及其 score 值加⼊到有序集 key 当中。 ZCARD ZCARD key 返回有序集 key 的基数。 ZSCORE ZSCORE key member 返回有序集 key 中,成员 member 的 score 值。 如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。 ZCOUNT (闭区间) ZCOUNT key min max 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的 成员的数量。 关于参数 min 和 max 的详细使⽤⽅法,请参考 ZRANGEBYSCORE 命令。 ZINCRBY ZINCRBY key increment member 为有序集 key 的成员 member 的 score 值加上增量 increment 。 ZRANGE ZRANGE key start stop [WITHSCORES]返回有序集 key 中,指定区间内的成员。 其中成员的位置按 score 值递增(从⼩到⼤)来排序。 具有相同 score 值的成员按字典序(lexicographical order )来排列。 ZRANGEBYSCORE ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有 序集成员按 score 值递增(从⼩到⼤)次序排列。 根据指定的分值范围去查找 ZRANK (排名从0开始) ZRANK key member 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从⼩到⼤)顺序排 列。 ZREVRANGE ZREVRANGE key start stop [WITHSCORES]返回有序集 key 中,指定区间内的成员。 其中成员的位置按 score 值递减(从⼤到⼩)来排列。 具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。 ZREVRANGEBYSCORE ZREVRANGE key start stop [WITHSCORES]返回有序集 key 中,指定区间内的成员。 ZREVRANK ZREVRANK key member 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从⼤到⼩)排序。 排名以 0 为底,也就是说, score 值最⼤的成员排名为 0 。 使⽤ ZRANK 命令可以获得成员按 score 值递增(从⼩到⼤)排列的排名。 ZREM ZREM key member [member ...]移除有序集 key 中的⼀个或多个成员,不存在的成员将被忽略。 当 key 存在但不是有序集类型时,返回⼀个错误。 ZREMRANGEBYRANK ZREMRANGEBYRANK key start stop 移除有序集 key 中,指定排名(rank)区间内的所有成员。 区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。 ZREMRANGEBYSCORE ZREMRANGEBYSCORE key min max 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
应⽤场景:可以⽤于⼀个⼤型在线游戏的积分排⾏榜,每当玩家的分数发⽣变化时,可以执⾏zadd更新
玩家分数(score),此后在通过zrange获取⼏分top ten的⽤户信息。
5 Redis的整合(Jedis) Java for Redis
5.1 导包
<dependency> <groupid>redis.clients</groupid> <artifactid>jedis</artifactid> <version>2.9.0</version></dependency>
5.2 配置
@Configurationpublic class RedisConfig { @Bean public Jedis jedis(){ Jedis jedis = new Jedis("localhost", 6379); return jedis; }}
5.3 使⽤
// 直接引⼊ @Autowiredprivate Jedis jedis;// 使⽤ 和在命令⾏客户端操作是⼀样的jedis.set();jedis.get();jedis.hset();jedis.hget();jedis.sadd();...
6 Springboot2.x中Redis进⾏连接(RedisTemplate)
RedisTemplate 简介,SpringBoot对Redis进⾏了⼀层模板化的封装,⽅便我们对对象进⾏操作。底层
在SpringBoot1.x的时候使⽤的是Jedis,在Springboot2.x后使⽤的是lettuce。
6.1 导包
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-redis</artifactid></dependency><!-- 序列化 --><dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-core</artifactid> <version>2.10.0</version></dependency> <dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-databind</artifactid> <version>2.10.0</version></dependency>
6.2 配置
@Configurationpublic class RedisConfig { @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(redisConnectionFactory); //定制化模板 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); // 设置value JackSon序列化⽅式 Jackson2JsonRedisSerializer jsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); // 对于不是基本类型的变量显示全类名 objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); //设置值的属性可⻅ objectMapper.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.AN Y); jsonRedisSerializer.setObjectMapper(objectMapper); redisTemplate.setValueSerializer(jsonRedisSerializer); return redisTemplate; }}
6.3 使⽤
redisTemplate.opsForValue().set(); redisTemplate.opsForHash().put(); redisTemplate.opsForList().leftPush(); redisTemplate.opsForSet().add(); redisTemplate.opsForZSet().add();
7 Springboot2.x中使⽤Redisson进⾏连接
Redisson:Redisson是⼀个在Redis的基础上实现的Java驻内存数据⽹格(In-Memory Data Grid)。它不仅提供了⼀系列的分布式的Java常⽤对象,还提供了许多分布式服务。其中包括( BitSet , Set ,
Multimap , SortedSet , Map , List , Queue , BlockingQueue , Deque , BlockingDeque ,Semaphore , Lock , AtomicLong , CountDownLatch , Publish / Subscribe , Bloom filter ,Remote service , Spring cache , Executor service , Live Object service , Scheduler service ) Redisson提供了使⽤Redis的最简单和最便捷的⽅法。Redisson的宗旨是促进使⽤者对Redis的关注分离(Separation of Concern),从⽽让使⽤者能够将精⼒更集中地放在处理业务逻辑上。
开源地址:https://github.com/redisson/redisson
7.1 导包
<dependency> <groupid>org.redisson</groupid> <artifactid>redisson</artifactid> <version>3.5.7</version></dependency>
7.2 配置
@Configurationpublic class RedissonConfig { @Bean public RedissonClient getRedisson(){ Config config = new Config(); config.useSingleServer().setAddress("redis://localhost:6379"); return Redisson.create(config); }}
7.3 使⽤
参考命令匹配列表
8 Redis内存淘汰策略
Redis官⽅给的警告,当内存不⾜时,Redis会根据配置的缓存策略淘汰部分的Keys,以保证写⼊成功。当⽆淘汰策略时或者没有找到适合淘汰的Key时,Redis直接返回 out of memory错误。
最⼤缓存配置
在Redis中,允许⽤户设置的最⼤使⽤内存⼤⼩
maxmemory 512G
Redis提供8种(5.0以后)数据淘汰策略:
建议:了解了Redis的淘汰策略之后,在平时使⽤时应尽量主动设置/更新key的expire时间,主动剔除不活跃的旧数据,有助于提升查询性能
위 내용은 Redis 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!