Redis基础
什么是Redis
redis是一款非关系型数据库,它是以键值对的方式来存储数据。通常用于做为缓存来使用。它具有对数据进行高并发的读写、 海量数据读写等优点。
在windowns系统中再DOS窗口中加入redis的安装目录,然后运行命令redis-server.exe redis.windows.conf即可开启redis。在另外一个DOS窗口中执行命令 redis-cli.exe 回车进入redis命令行工具输入auth ‘password’验证身份即可成功连接redis数据库。
Redis的基本数据类型
key
redis数据库是通过key来获取存储的数值的。key都是String类型的数据。
命令 | 描述 |
---|---|
keys* | 查看当前库中的所有key |
exists key | 判断某个key是否存在 |
type key | 查看某个key的类型 |
del key | 删除指定的key |
unlink key | 异步删除指定的key |
expire key 10 | 给key设置时间。expire key 10即为10秒后过期 |
ttl key | 查看该key还有多少秒过期。-1表示永不过期,-2表示已过期 |
select | 切换数据库 select 0 表示切换到0号数据库 |
dbsize | 查看当前数据库key的个数 |
dbflush | 删除当前数据库的所有key |
String
String是redis中最基本的数据类型,String的内部实现类似于ArrayList采用预分配冗余空间的方式来减少内存的频繁分配。String类型一个key对应一个value。String是二进制安全的它可以存储任何数据。比如jpg图片或者序列化对象。String类型的value最大为512M。
命令 | 描述 |
---|---|
set key value | 将key value加入到数据库中去,如果存在该key则覆盖原先的value |
get key | 查询key对应的value |
append key value | 对给定的value末尾进行追加value |
strlen key | 获取值的长度 |
setnx key value | 只有key不存在时才设置值 |
incr key | 将key的值加一,只能对数字进行操作,如果该值为空则新增值为1 |
decr key | 将key的值减一,只能对数字进行操作,如果该值为空则新增值为-1 |
mset k1 v1 k2 v2… | 向数据库加入多个键值对 |
mget k1 k2… | 通过多个key获取多个value |
msetnx k1 v1 k2 v2… | 向数据库加入多个键值对,当且仅当所有的key都不存在时成功,否则失败 |
getrange key startindex endindex | 获取给定范围的数值(包括起始和结束的位置) |
setrange key start value | 向对应值的后面拼接新值 |
list
list类型可以让一个key对应多个有序(指加入的顺序)的value。每一个value也是string类型。llist的数据结构是一个特殊的链表结构。
命令 | 描述 |
---|---|
lpush/rpush k1 v1 k2 v2… | 从左/右插入一个或者多个键值对 |
lpop/rpop key | 从左/右边吐出一个值。值在键在,值光键亡 |
rpoplpush key1 key2 | 从key1列表右边吐出一个值,插入到key2列表的左边 |
lrange key start stop | 按照索引下标获取元素,从左到右 |
lindex key index | 按照索引下标获取元素,从左到右 |
llen key | 获取列表长度 |
linsert key before value newvalue | 在value的后面插入值newvalue |
lrem key n value | 删除n个value,从左到右 |
lset key index value | 将列表key下标为index的值替换为value,从左计数 |
set
set类型可以让一个key对应多个无序的value而相比于list它的特殊之处在于set可以自动进行去除重复数据。每一个value也是string类型的数据。它的底层是一个value为null的hash表,所以增删改的效率很高。
命令 | 描述 |
---|---|
sadd key v1 v2… | 加入一个或者多个值进入集合,重复值将被忽略 |
smembers key | 取出集合中的所有元素 |
sismember key value | 判断该集合是否包含value,包含返回1否则返回0 |
scard key | 返回该集合包含元素的个数 |
srem key v1 v2… | 删除集合中的某一些元素 |
spop key | 随机从集合中吐出一个数值 |
srandmember key n | 随机从集合中吐出一个值,但不删除 |
smove source destination value | 把集合中的某个值移动到另外一个集合中去 |
sinter key1 key2 | 返回两集合的交集元素 |
sunion key1 key2 | 返回两集合的并集元素 |
sdiff key1 key2 | 返回两集合的差集元素 |
map
该数据类型相当于一个key对应了一个map集合,该集合中的元素,键和值都是string类型。该数据类型的底层也是用一个hash实现的。
命令 | 描述 |
---|---|
hset key field value | 给key对应的map中的field键赋值为value |
hget key field | 从key对应的map中取出键field的值 |
hmset key f1 v1 f2 v2… | 批量向key对应的map中加入数据 |
hexists key field | 查看key对应map中field键是否存在 |
hkeys key | 列出key对应的map中的所有field |
hvals key | 列出key对应的map中的所有value |
hincrby key field increment | 向key对应的map中的field的值加上增量 |
hsetnx key field value | 给key对应的map中的field键赋值为value,当且仅当field不存在 |
zset
该数据类型相当于set,但是zset集合中的数据是有序的(利用score进行排序)。
命令 | 描述 |
---|---|
zadd key s1 v1 s2 v2… | 将一个或多个元素以及元素对应的score加入到集合中 |
zrange key start stop [withscores] | 返回集合start-stop之间的元素,带有withscore时可以同score一起返回 |
zrangebyscore key min max [withscores] [limt offset count] | 返回有序集合中介于min于max的成员,按score递减返回 |
zrevrangebyscore key max min [withscores] [limt offset count] | 同上,按递增返回 |
zincrby key increment value | 为value加上增量 |
zrem key value | 删除集合指定的元素 |
zcount key min max | 统计score介于min与max之间的元素个数 |
zrank key value | 返回该值的排名,从0开始 |
发布与订阅
redis发布订阅是一种消息通信模式:发送者发送消息,订阅者接收消息。redis客户端可以订阅任意数量的频道。
订阅一个频道p: subscribe p
给频道p发布消息hello: piblish p hello
事务
事务的使用
MULTI语句用于开启事务,接下来的执行操作语句都会被加入到队列中去(当有一次命令被检测出语法错误时,该队列会被自动取消),当执行EXEC时,该队列中的语句会被依次执行(在执行队列中的命令时,如果一条语句执行失败,它不会影响到其他语句的执行),而当执行DISCARD语句时,则会取消该队列,放弃这次事务操作。
事务的特性
单独的隔离级别:事务中的所有命令都会被序列化、按顺序的执行。事务在执行过程中不会被其他客户端发过来的命令请求所打断。
没有隔离级别的概念:队列中的命令没有提交之前不会被实际的执行。(因为 Redis 在执行命令时是单线程的(即使 Redis 6.0 增加多线程特性,大部分的数据操作的命令还是单线程的),而且事务中的命令都是在提交的时候一次性执行的,所以并不需要考虑在多线程并发的情况下事务隔离的情况。)
不保证原子性:事务中的命令在执行过程中一条命令失败其他命令也会被执行,没有回滚机制。
WATCH语句
我们可以使用已有的命令来实现简单的类似事务隔离特性的功能,主要思路就是使用 WATCH 监控事务中需要操作的值,以保证事务操作前后所监控的值不发生变化,或者发生变化以后中断事务操作。
SpringBoot集成Redis
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
配置application.propertie
spring.redis.host=127.0.0.1
#Redis服务器连接端口
spring.redis.port=6379
#Redis服务器连接密码(默认为空)
spring.redis.password=
#连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.pool.max-idle=8
#连接池中的最小空闲连接
spring.redis.pool.min-idle=0
#连接超时时间(毫秒)
spring.redis.timeout=30000
RedisTemplate和StringRedisTemplate
当SpringBoot集成了Redis,我们可以使用RedisTemplate和StringRedisTemplate来操作Redis。两者的区别在于StringRedisTemplate的两个泛型都是String类型只能存储String类型的键值对,而RedisTemplate两个泛型都是object类型,意味着key-value可以是对象被序列化到redis中去,也可以从redis中反序列化成为一个对象(这些对象都需要实现序列化接口)。