Redis入门
概念: REmote DIctionary Server
是用C语言开发的一个开源的高性能键值对(key-value)数据库。
特征:
1、数据间没有必然的关联关系
2、内部采用单线程机制进行工作
3、高性能
4、多数据类型支持(String、list、hash、set、sorted_set)
5、持久化支持。可以进行数据灾难恢复,突发状况,比如断点
应用:
1、为热点数据加速查询(主要场景),如热点商品,热点新闻,热点资讯等高访问量信息等
2、任务队列,如秒杀、抢购、购票排队等
3、即时信息查询,如各位排行榜,各类网站访问统计、公交到站信息、在线人数信息、设备信号等
4、时效性信息的控制,如验证码控制、投票控制等
5、分布式数据共享,如分布式集群架构中的session
6、消息队列
7、分布式锁
redis安装包文件:
redis-server.exe:启动redis的可执行文件
redis-cli.exe:操作redis,命令行客户端
redis-check-aof.exe:持久化用的,AOF文件修复工具
redis-check-dump.exe:RDB文件检查工具(快照持久化文件)
redis-bechmark.exe:性能测试工具
redis-windows.conf:redis核心配置文件
redis的基本操作:
一、功能性命令
1、信息添加。 set key value
2、信息查询,如果不存在,返回空(nil)。 get key
3、删除信息。del key
二、清除屏幕信息
clear
三、帮助信息查阅
help 命令名
help @组名
四、退出指令
quit
exit
<ESC>
数据类型
一、string
1、基本操作:
-
添加/修改数据
set key value
-
获取数据
get key
-
删除数据
del key
-
Multiple:多个
-
添加/修改多个数据
mset key1 value1 key2 value2...
-
获取多个数据
mget key1 key2...
-
获取数据字符个数
strlen key
-
追加信息到原始信息后部
append key value
2、扩展操作:
-
设置数值数据增加指定范围的值
incr key 一次增加一个单位 incrby key increment increment可为正或负 incrbyfloat key increment
-
设置数值数据减少指定范围的值
decr key 一次减少一个单位 decrby key increment
redis用于控制数据库表主键id,为数据库主键提供生成策略,保障数据库表的主键唯一性,此方案适用于所有数据库,且支持数据库集群。
-
设置数据具有指定的生命周期
setex key seconds value 秒为单位,重新set会覆盖之前的set psetex key milliseconds value 毫秒为单位
redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限制控制的操作。
redis应用于各种结构型和非结构型高热度数据访问加速
3、注意事项
数据操作不成功的反馈与数据正常操作之间的差异
数据未获取到
数据最大存储量(512MB)
数值计算最大范围(java中的long的最大值:9223372036854775807)
4、key的命名规范
表名:主键名:主键值:字段名
二、hash
对象类数据的存储如果具有较频繁的更新需求操作会显得笨重。
对一系列存储的数据进行编组,方便管理,典型应用存储对象信息。
一个存储空间保存多个键值对数据。
1、基本操作
-
添加/修改数据
hset key field value
-
获取数据
hget key field hgetall key
-
删除数据
hdel key field1 [field2]
-
添加/修改多个数据
hmset key field1 value1 field2 value2...
-
获取多个数据
hmget key field1 field2...
-
获取哈希表中字段的数量
hlen key
-
获取哈希表中是否存在指定的字段
hexists key field
2、扩展操作
-
获取哈希表中所有的字段名或字段值
hkeys key hvals key value值可能会重复,如果重复,照样获取
-
设置指定字段的数值数据增加指定范围的值
hincrby key field increment hincrbyfloat key field increment 没有hdecrby,可以将increment设为负值
3、注意事项
- hash类型下的value只能存储字符串,不允许其他数据类型,不存在嵌套现象,如果数据未获取到,对应值为空(nil)。
- 每个hash可以存储2^32 -1个键值对。
- hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用。
- hgetall操作可以获取全部属性,如果内部field过多,便利整体数据效率就会很低,有可能成为数据访问瓶颈。
三、list
数据储存需求:存储多个数据,并对数据进入存储空间的顺序进行分区。
需要的储存结果:一个储存空间保存多个数据,且通过数据可以体现进入顺序。
list类型:保存多个数据,底层使用双向链表存储结构实现。
1、基本操作
-
添加/修改数据
l/rpush key value1 [value2] l/rpushx key value 将一个值插入到已存在的列表头部 linsert key before/after key value 在列表的元素前或者后插入元素
-
获取数据
lrange key start stop lrange key 0 -1 获取全部数据 lindex key index llen key
-
获取并移除数据
lpop key rpop key
2、扩展操作
-
规定时间内获取并移除数据
blpop key1 [key2] timeout b:阻塞版本,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止,比如任务队列。 brpop key1 [key2] timeout brpoplpush list1 list2 timeout 从列表中取出最后一个元素,并插入到另外一个列表的头部; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
-
lrem key count value
移除表中count个与value相等的值,count>0从表头开始,count<0从表尾开始
3、注意事项
- list中保存的数据都是string类型的,数据总容量是有限的,最多2^32-1个元素(4294967295)。
- list具有索引的概念,但是操作数据时通常以队列的形式入队出队操作,或以栈的形式进行入栈出栈操作。
- 获取全部数据操作结束索引设置为-1。
- list可以对数据进行分页操作,通常第一页信息来自于list,第二页以及更多的信息通过数据库的形式进行加载。
- 可以重复添加。
四、set
新的需求:存储大量数据,在查询方面提供更高的效率
需要的存储结构:能够保存大量数据,高效的内部存储机制,便于查询
set类型:与hash存储结构完全相同,仅存储键,不存储值,并且键是不允许重复的
1、基本操作
-
添加数据
sadd key member1 [member2]
-
获取全部数据
smembers key
-
删除数据
srem key member1 [member2]
-
获取集合数据总量
scard key
-
判断集合中是否包含指定数据
sismember key member
2、扩展操作
-
随机获取集合中指定数量的数据
srandmember key [count]
-
随机获取集合中的某个数据并将该数据移出集合
spop key
-
求两个集合的交,并,差集,差集有先后顺序
交:sinter key1 [key2]
并:sunion key1 [key2]
差:sdiff key1 [key2]
-
求两个集合的交、并、差集并存储到指定集合中
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
-
将指定数据从原始集合中移动到目标集合中
smove source destination member
3、注意事项
- set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份。
- set虽然与hash的存储结构相同,但是无法启动hash中存储值的空间
五、sorted_set
新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式。
新的存储结构:新的存储类型,可以保存可排序的数据。
sorted_set类型:在set结构基础上添加可排序字段(score)。
1、基本操作
-
添加数据
zadd key score1 member1 [score2 member2]
-
获取全部数据
zrange key start stop [withscores] 由小到大
[withscores]:带上score值
zrevrange key start stop [withscores] 由大到小
-
删除数据
zrem key member [member…]
-
按条件获取数据
zrangebyscore key min max [withscores] [limit]
跟mysql数据库的limit功能一致,检索前多少条记录
zrevrangebyscore key max min [withscores]
-
条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max
-
注意:
min与max用于限定搜索查询的条件。
start与stop用于限定查询范围,作用于索引,表示开始和结束索引。
offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量。
-
获取集合数据总量
zcard key
zcount key min max
-
集合交、并操作
交:
zinterstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和。
并:zunionstore destination numkeys key [key …]
如果destination已存在,则覆盖。
2、扩展操作
-
获取数据对应的索引(排名)
zrank key member
zrevrank key member
-
score值获取与修改
zscore key member
zincrby key increment member
3、注意事项
- score把偶才能的数据存储空间是64位
- score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
- sorted_set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果
- 注意score长度,整体score长度必须是统一的,不足位补0,第一排序规则首位不得是0。
应用场景:涉及到排序的,投票,排行榜,统计,带有权重的消息队列
通用指令
一、key
1、基本操作
-
删除指定key
del key
-
获取key是否存在
exists key
-
获取key对应值的类型
type key
2、扩展操作(时效性控制)
-
为指定key设置有效期
expire key seconds pexpire key milliseconds expireat key timestamp pexpireat key milliseconds-timestamp 时间戳
-
获取key的有效时间
ttl key time to live,返回-1是永久,返回-2是不存在 pttl key
-
切换key从时效性转换成永久性
persist key
3、扩展操作(查询模式)
-
keys pattern
查询模式规则:
* 匹配任意数量的任意符号
? 匹配一个任意符号
[] 匹配一个指定符号
4、其他操作
-
为key改名
rename key newkey
renamenx key newkey
-
对所有key排序,list或set或sorted_set
sort key [desc/asc] 排序不懂原数据
-
其他key通用操作
help @generic
二、db基本操作
redis为每个服务器提供16个数据库,编号0-15,每个数据库之间的数据相互独立,他们共用一块空间,空间配置以后再说。
1、基本操作
-
切换数据库,默认在0块区域
select index
-
其他操作
quit
ping 看与服务器是否连通
echo message 输出信息
-
数据移动
move key db
移动并删除,相当于剪切操作;必须保证另一个数据库中没有,否则会失败
-
数据清除
dbsize 看数据库中有多少个key
flushdb
flushall
Jedis
Java语言连接redis服务:Jedis、SpringData Redis、Lettuce
客户端连接Redis
import redis.clients.jedis.Jedis;
public class jedis {
public static void main(String[] args) {
//1、连接redis
Jedis jedis = new Jedis("127.0.0.1", 6379);
//2、操作redis
jedis.set("name","luqian");
System.out.println(jedis.get("name"));
//3、关闭redis连接
jedis.close();
}
}
jedis简易工具类,基于连接池获取
JedisPool:Jedis提供的连接池技术
poolConfig:连接池配置对象
host:redis服务地址
port:redis服务端口号
public class JedisUtil {
public static Jedis getJedis(){
JedisPoolConfig jpc = new JedisPoolConfig();
//最大连接数
jpc.setMaxTotal(30);
//活动连接数
jpc.setMaxIdle(10);
String host = "127.0.0.1";
int port = 6379;
JedisPool jp = new JedisPool(jpc,host,port);
return jp.getResource();
}
}
可视化客户端:Redis Desktop Manager