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常用命令
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
21) "requirepass"
2) "test123" - 获得实体存储的相关命令
> config get *max-*-entries*
返回的数据1
2
3
4
5
61) "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
后面加上需要验证的密码
如:重启redis服务器之后进入命令行就要使用1
requirepass test1234
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 | <dependency> |
2、连接和配置redis
1 | # Redis 配置 |
3、java中配置Redis的操作对象
1、在启用类的类头哪里使用@EnableCaching
注解开启redis
2、获得redis的模板对象
1 | /** |
3、在bean的构造函数中初始化模板。主要是用来设置序列化的方式
1 |
|
初始化方法如下
1 | /** |
4、使用redis的模板来操作redis
涉及到的函数为
boolean hashKey = redisTemplate.hasKey(key)
判断redis中是否含有key值- 获得操作Redis对象的函数,其中的Dictionary是放进去的对象,redis会自动完成ORM的设置key对应的值
1
ValueOperations<String,Dictionary> operations = redisTemplate.opsForValue();
operations.set(key,dictionary,timeout,TimeUnit.HOURS);
key为对应的String类型的key值。dictionary
为设置到缓存的对象。会被序列化为stirng类型。timeout
为过期时间,long类型TimeUnit.HOURS
是timeout的单位.可以设置纳秒、微秒、分钟、小时、天等。缓存穿透和缓存雪崩
1、缓存穿透
如何理解缓存穿透,缓存原本是放在数据库读写之前的一层缓存。用来减少数据库的io。穿透就是数据直接穿透缓存访问数据库,可以理解为缓存被穿透了。什么时候会导致缓存穿透?为什么会出现缓存穿透?读写数据的时候没有在redis中命中数据。导致访问数据库。没有命中数据 -> 访问数据库。缓存的命中率太低了,导致缓存不起作用。这样就出现缓存穿透2、缓存雪崩
什么是缓存雪崩?在某一时间段,缓存中的数据集体失效,导致大量的数据库出现大量的io请求。缓存中数据在同一时间失效。这就是缓存的雪崩,缓存雪崩可能会导致数据库的崩溃。如何避免缓存雪崩?雪崩的原因是同一时间失效,设置随机失效时间。