0%

Redis基础知识

Redis基本数据类型

Binary-safe strings

string 类型是二进制安全的.意思是redis的string可以包含任意数据,比如jgp图片或者已经序列化的的对象.

Lists

实质是每一个都是string类型的双向链表,push和pop的命令算法的时间复杂度都是O(1),list还会记录链表的长度,所以llen操作也是O(1).

Sets

是string类型的无序集合.set是通过 hash table实现的,所以添加,查找,删除的复杂度都是O(1),hash table 会随着添加或者删除自动调整大小.

Sorted sets

sorted sets 也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score,元素顺序有score决定.sorted sets的实现是skip list和hash table的混合体.

Hashes

是string类型的field和value的映射表.它的添加和删除都是O(1).hash特别适合用于存储对象

Bit arrays

可以用特殊的命令,处理string的value,像处理一个位数组一样

HyperLogLogs

它是一个概率数据库.(用于估算集合的基数)

Redis 基本命令

操作string的命令

  • set key value
  • get key value
  • mset key1 value1 key2 value2
  • mget key1 key2

  • incr key 对值做加加,返回新的值(对不存在的key返回1,对非intkey会报错)

  • decr key 对值做减减,返回新的值(对不存在的key返回1,对非intkey会报错)
  • incrby key integer 加指定值(key不存在会认为,原来的value为0)
  • decrby key integer 减指定值(key不存在会认为,原来的value为0)
  • append key value 给指定key的字符串追加value
  • substr key start end 返回截取过的key的字符串值,注意并不修改key,下标从0开始,区间前闭后闭

操作list的命令

  • lpush key string 在key对应的头部添加字符串元素,返回1代表成功,返回0表示key存在且不是list类型
  • rpush key string 在key对应的尾部添加字符串元素,返回1代表成功
  • lpop key 从list的头部删除元素,并返回删除的元素,如果list不存在或为空返回nil,如果不是list返回错误
  • rpop key 同上,但是从尾部删除
  • llen key 返回key对应list的长度,key不存在返回0,如果key对应的不是list返回错误
  • lrange key start end 返回指定区间内的元素,下标从0开始,负值表示从后面计算,-1表示倒数第一个元素,key不存在返回空列表
  • ltrim key start end 截取list,保留指定区间内元素,成功返回1,key不存在返回错误
  • lset key index value 设置list中指定下标的元素值,成功返回1,key或者下标不存在返回错误
  • linsert key before value value2在值value前插入值value2

操作sets的命令

  • saad key value 添加一个string元素到key对应的set集合,成功返回1,如果元素已经在元素中返回0,可以对应的set不存在返回错误
  • srem key value 从key对应set中移除给定元素,成功返回1,如果value在集合中不存在或者key不存在返回0,key对应的不是set类型返回错误
  • spop 删除并返回set中一个随机元素,如果set是空或者key不存在返回nil
  • srandommembe key 同 spop,但是不删除元素

操作sorted sets的命令

  • zadd key score member 添加元素到集合,当member已存在,更新score
  • zrem key member 删除指定元素,1表示成功,如果不成功返回0

操作hashes的命令

  • hset key field value 设置hash field 为指定值,如果key不存在则先创建
  • hget key field 获取指定hash的hash field

Redis高级特性

安全性

设置redis密码,可以配置redis.conf也可以直接在redis-cli中设置

1
config set requirepass ******

查看redis是否设置密码

1
config get requirepass

主从复制

Redis主从复制过程:

  • slave和master建立连接,发送sync同步命令
  • master会启动一个后台线程,将数据库线程保存到文件中,同时master主线程会开始收集新的写命令缓存.
  • 后台完成保存后,就将此文件发送给slave
  • slave将此文件保存到硬盘上

事务处理

  • redis对事务的支持比较简单,redis只能保证一个client发起的事务中的命令可以连续执行,而中间不会插入其他的client命令.当一个client在发出multi命令时,这个连接会进入一个事务的上下文,连续后续命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序执行队列中的所有命令.

  • redis在事务中发生错误不会回滚.

持久化

redis提供了一系列不同的持久化选项:

  • RDB持久化方式会在一个特定的间隔保存那个时间点的一个数据快照.
  • AOF持久化方式则会记录每一个服务器收到的写操作。在服务启动时,这些记录的操作会逐条执行从而重建出原来的数据。写操作命令记录的格式跟Redis协议一致,以追加的方式进行保存.

发布订阅消息

发布订阅(pub/sub)是一种消息通知模式,主要的目的是截除消息发布者和消息订阅者之间的耦合,Redis作为一个pub/sub的server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel).当发布者通过publish命令向redis server发送特定类型的信息时,订阅该信息类型的全部client都会收到此消息.

虚拟内存

Redis的虚拟内存与操作系统的虚拟内存不是一回事,但是思路和目的都是相同的.就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据.尤其是对于redis这样的内存数据库,内存总是不够用的.除了可以将数据分割到多个redis server外.另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上.

Redis集成Spring Boot

pom文件添加redis依赖

1
2
3
4
5
<!-- redis -->  
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>

application.properties增加redis相关属性

1
2
3
4
5
6
7
8
9
#redis  
spring.redis.hostName=goodgoodstate.me
spring.redis.port=6379
spring.redis.password=xxx
spring.redis.pool.maxActive=8
spring.redis.pool.maxWait=-1
spring.redis.pool.maxIdle=8
spring.redis.pool.minIdle=0
spring.redis.timeout=0

配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class RedisConfiguration {

@Bean
@ConditionalOnMissingBean(value ={ StringRedisTemplate.class, RedisTemplate.class})
public StringRedisTemplate redisTemplate(
RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}

Java操作Redis

设置Redis中String类型的键值对,600秒自动失效

1
redisTemplate.opsForValue().set("key", "value", 600, TimeUnit.SECONDS);

获取Redis中String类型的value

1
String value = (String) redisTemplate.opsForValue().get("key");

获取操作Hash对象

1
HashOperations<String, String, String> hashOperations = redisTemplate.opsForHash();

put一个map对象

1
hashOperations.putAll(key, new HashMap<>());

获取一个hash里面的maspKey对应的值

1
String value = hashOperations.get("key", "mapKey");

iisheng wechat
微信扫码关注 Coder阿胜