long blogs

进一步有进一步惊喜


  • Home
  • Archive
  • Tags
  •  

© 2025 long

Theme Typography by Makito

Proudly published with Hexo

Redis笔记

Posted at 2019-09-04 笔记 spring 

Redis拿来干什么?

redis是运行在内存的软件。速度快,完全基于内存。使用C语言实现,网络层使用epoll解决高并发问题。单线程模型,避免不必要的上下文切换和竞争条件浪费资源。Redis可以用在下面的场景。
1、缓存。常用的功能
2、数据排序 使用Redis的SortSet数据结构能够非常方便搞定
3、计算器/请求限流 秒杀的时候,将数据缓存在Redis中。减少数据库的频繁读写。
4、使用集合的命令获得相关的数据
5、简单的消息队列。使用Redis的list实现消息队列
6、Session共享、token实现单点验证

Redis数据类型

Redis提供8种数据类型,常用的主要是String、Hash、List、Set、SortSet这5种类型。另外还有BitMap-位图、HyperLogLog、GEO-地理信息定位。
存储的为Key-Value的值。

Redis常用命令

中文Redis命令翻译网址

1、基本操作

  • 启动Redis
    ./redis-server ../redis.conf
  • 启动Redis的脚本工具
    ./redis-cli
  • 存储数据的命令
    > set mykey myvalue
    使用set语句 后面加上key值和value值
  • 查看是否含有某个key值
    > exists mykey
    如果存在返回1 如果不存在返回0
  • 获得key值对应的value
    > get mykey
  • 查看key值对应的数据类型
    > type mykey
    如果是字符型返回string
  • 使用正则匹配查找对应的数据
    > keys my*
    查找含有my开头的key。查到返回对应的key列表。找不到返回empty list or set
  • 删除对应的key值
    > del key
    也可以使用正则匹配来删除
    > del key*
  • 随机获得一个key
    > randomkey
  • 清除所有的key值
    > clear
  • 重命名key值
    > rename newkey oldkey
  • 查看当前的数据库的大小
    > dbsize

2、Redis时间过期相关的命令

  • 限定key的生存时间
    > expire key 20设置key值20秒后过期
  • 查看过期时间
    > ttl key 查看key的值还有多少秒过期
    过期后会返回-2
  • 清除整个db
    > flushdb
    > flushall

3、配置Redis的命令

  • 配置requirepass
    获得账号名
    > config get requirepass
    设置密码
    > config set requirepass test123
  • 使用密码验证
    > auth test123
    重新查看账号
    > config get requirepass
    返回值如下
1
2
1) "requirepass"
2) "test123"
  • 获得实体存储的相关命令
    > config get *max-*-entries*
    返回的数据
1
2
3
4
5
6
1) "hash-max-ziplist-entries"
2) "512"
3) "set-max-intset-entries"
4) "512"
6) "zset-max-ziplist-entries"
7) "128"
  • 重置配置
    > config resetstat
  • 服务器的信息
    > info server
  • 连接客户端的信息
    > info client
  • 内存的信息
    > info memory
  • 持久层数据
    > info persistence
  • 状态的数据
    > info stats
  • 从节点的信息
    > info replication
  • cpu的信息
    > info cpu

4、配置文件配置账号

在配置文件redis.conf的文件中。在requirepass后面加上需要验证的密码
如:

1
requirepass test1234

重启redis服务器之后进入命令行就要使用
auth test1234 来验证了

5、事务的处理

使用multi命令开启一个事务
然后接下来可以进行一些命令的操作
使用exec命令批量执行操作

6、持久化的操作

将内存中的数据存储到磁盘文件中
使用save命令

Redis五大数据类型以及简单使用

String字符串类型

1、添加数据

set key-name value
如果key存在则修改里面的值,如果不存在就添加

2、查询数据

get key-name

3、删除数据

del key-name

4、设置key的过期时间

setex key-name 10 value
设置key的过期时间为10秒

5、设置多组值

mset key-name1 value1 key-name2 value2

6、获得多组值

mget key-name1 key-name2

Hash表

1、添加Hash表数据

hset key-name hash-key hash-value
例如:
hset user name "smith"
添加一个hash表的名字为user,其中user中有[name=”smith”]的键值对

2、查询数据

hget key-name hash-key
例如:
hget user name
查询user中key为name的值

3、获得全部的键值对

hgetall key-name

4、一次设置多个键值对

hmset key-name hash-key1 hash-value1 hash-key2 hash-value2

5、查看数据长度

hlen key-name
返回该Hash表的键值对数量

6、查询是否存在某个hash-key

hexist key-name hash-key

List列表

1、添加数据

lpush/rpush key-name value1 value2 value3
其中lpush从左边插入数据,rpush从右边插入数据

2、获得数据

lpop/rpop key-name
弹出列表最左边/右边的值。

3、遍历数据

lrange key-name start stop
遍历下标为[start,stop]的数据
例如:
lrange city 0 -1
遍历全部数据

4、获得列表长度

llen key-name

Set

Set是String类型的无序集合,元素值不能重复

1、添加数据

sadd key-name value1 value2

2、获得数据

smembers key-name
获得所有数据

3、查询是否存在某个成员

sisexist key-name member

4、移除某个成员

srem key-name member

ZSet类型

zset类型可以排序,每个值都有对应的score,可以进行集合间的操作

1、添加数据

zadd key-name score1 member1 score2 member2

2、移除数据

zrem key-name member [member2...]
使用[]来标识里面的内容为可选内容

3、查询成员数量

zcard key-name

4、查询成员的分值

zscore key-name member

5、修改成员的分值

zincrby key-name increase-num member
给成员的分值加上increase-num的值,可为正,可为负。

6、根据score区间查询成员

zcount key-name min max
返回分值介于[min,max]区间的成员

7、查询成员的排名

(1) zrank key-name member
返回成员在集合中的排名,按照分值从小到大排
(2)zrevrank key-name member
返回成员的排名,按照分值从大到小排

8、根据排名区间获得成员

(1) zrange key-name start stop [WITHSCORES]
返回排名处于[start stop]区间内的成员,withscores选项会返回成员的分值。成员按照分值从小到大排序
(2) zrevrange key-name start stop [WITHSCORES]
和zrange一致,区别是按照分值从大到小排序

9、根据分数区间获得成员

(1)zrangebyscore key-name min max [WITHSCORES] [LIMIT offset count]
返回分数处于[min,max]区间的成员,按照分数从小到大排列
(2)zrevrangebyscore key-name min max [WITHSCORES] [LIMIT offset count]
和(1)中的作用一致,不同的是成员按照分数从大到小排列

10、多个ZSet进行交集运算

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
例子:
zset zkey3 2 zkey1 zkey2
zkey3放置zkey1和zkey2进行交运算之后的结果。其中2表示有两个集合。

11、多个ZSet进行并集运算

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
相同的成员分数相加。

使用Jedis来访问redis

1、maven添加依赖

引入redis的依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、连接和配置redis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Redis 配置
spring.redis.jedis.pool.max-idle=10
spring.redis.jedis.pool.max-active=10
spring.redis.jedis.pool.min-idle=5
spring.redis.jedis.pool.max-wait=2000
#配置Redis服务器属性
spring.redis.port=6379
spring.redis.host=localhost
# 连接的密码
spring.redis.password=password
# 连接超时设置
spring.redis.timeout=1000

# 缓存配置
spring.cache.type=redis
spring.cache.cache-names=redisCache
3、java中配置Redis的操作对象

1、在启用类的类头哪里使用@EnableCaching注解开启redis
2、获得redis的模板对象

1
2
3
4
5
/**
* 注入RedisTemplate对象
*/
@Autowired
private RedisTemplate redisTemplate = null;

3、在bean的构造函数中初始化模板。主要是用来设置序列化的方式

1
2
3
4
@PostConstruct
public void init() {
initRedisTemplate();
}

初始化方法如下

1
2
3
4
5
6
7
8
/**
* 设置RedisTemplate的序列化器
*/
private void initRedisTemplate() {
RedisSerializer stringSerializer = redisTemplate.getStringSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
}

4、使用redis的模板来操作redis
涉及到的函数为

  • boolean hashKey = redisTemplate.hasKey(key) 判断redis中是否含有key值
  • 获得操作Redis对象的函数,其中的Dictionary是放进去的对象,redis会自动完成ORM的
1
ValueOperations<String,Dictionary> operations = redisTemplate.opsForValue();

设置key对应的值
operations.set(key,dictionary,timeout,TimeUnit.HOURS);
key为对应的String类型的key值。
dictionary为设置到缓存的对象。会被序列化为stirng类型。
timeout为过期时间,long类型
TimeUnit.HOURS是timeout的单位.可以设置纳秒、微秒、分钟、小时、天等。

缓存穿透和缓存雪崩

1、缓存穿透

如何理解缓存穿透,缓存原本是放在数据库读写之前的一层缓存。用来减少数据库的io。穿透就是数据直接穿透缓存访问数据库,可以理解为缓存被穿透了。什么时候会导致缓存穿透?为什么会出现缓存穿透?读写数据的时候没有在redis中命中数据。导致访问数据库。没有命中数据 -> 访问数据库。缓存的命中率太低了,导致缓存不起作用。这样就出现缓存穿透

2、缓存雪崩

什么是缓存雪崩?在某一时间段,缓存中的数据集体失效,导致大量的数据库出现大量的io请求。缓存中数据在同一时间失效。这就是缓存的雪崩,缓存雪崩可能会导致数据库的崩溃。如何避免缓存雪崩?雪崩的原因是同一时间失效,设置随机失效时间。

Share 

 Previous post: javaScanner输入数据 Next post: Spring 事务 

© 2025 long

Theme Typography by Makito

Proudly published with Hexo