目录
Redis简介
NoSQL
Redis
Redis的应用
Redis 的数据存储类型介绍
String
string类型数据的操作
hash
hash类型数据的操作
list
list类型数据的操作
set
set类型数据的操作
sorted_set
sorted_set类型数据的操作
key通用操作
key特征
key基本操作
key扩展操作(时效性控制)
key扩展操作(查询模式)
key其他操作
数据库通用操作
db相关操作
Jedis简介
客户端连接redis
基于连接池获取连接
NoSQL:即Not-Nnly SQL(泛指菲关系型数据库),作为关系型数据库的补充。
作用:应对基于海量用户和海量数据前提下的数据处理问题。
特征:
可扩容,可伸缩
大数据量下高性能
灵活的数据模型
高可用
常见的NoSQL数据库有:
概念:Redis(REmote DIctionary Service)是用c语言开发的一个开源的高性能键值对(key-value)数据库。
特征:
1. 数据间没有必然的关联关系
2. 内部采用单线程机制进行工作
3. 高性能。官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s。
4. 多数据类型支持:
5. 持久化支持。可以进行数据灾难恢复
为热点数据加速查询(主要场景),如热点商品,热点新闻,热点资讯,推广类等高访问量信息等
任务队列,如秒杀,抢购、购票排队等
即时信息查询,如各种排行榜,各类网站访问统计,公交到站信息、在线人数信息等
时效性信息控制,如验证码控制,投票控制等
分布式数据共享,如分布式集群架构中的session分离
消息队列
分布式锁
redis自身是一个Map,其中所有的数据都是采用key:value的形式存储。
数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串。
存储单个数据,是最简单的数据存储类型,也是最常用的数据存储类型,一个存储空间保存一个数据。
存储内容通常是字符串。如果字符串以整数的形式展示,可以作为数字操作使用。
基本操作:
操作命令 | 命令功能 | 例子 |
set key value | 添加或修改数据 | set k1 v1 |
get key | 获取数据 | get k1 |
del key | 删除数据 | del k1 |
mset key1 value1 key2 value2... | 添加或修改多个数据 | mset k1 v1 k2 v2... |
mget key1key2... | 获取多个数据 | mget k1 k2... |
strlen key | 获取数据字符的个数 | strlen k1 |
append key value | 追加信息到原始信息后部(如果原始信息存在就追加,否则新建) | append k1 v2 |
扩展操作:
操作命令 | 命令功能 |
incr key incrby key increment incrbyfloat key increment |
设置数值数据增加指定范围的值 |
decr key decrby key increment |
设置数值数据减少指定范围的值 |
redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作:
操作命令 | 命令功能 |
setex key seconds value | 设置数据具有指定生命周期(秒为单位) |
psetex key milliseconds value | 设置数据具有指定生命周期(毫秒为单位) |
key的设置约定:
结构如图,一个key指向一个hash,hash里也是以键值对方式存储数据,即一个存储空间保存多个键值对数据;
底层是使用哈希表结构实现数据存储。
基本操作:
操作命令 | 命令功能 |
hset key field value | 添加或修改数据 |
hget key field hgetall key |
获取数据 |
hdel key field1 [field2] | 删除数据 |
hlen key | 获取hash内数据的条数 |
扩展操作:
操作命令 | 命令功能 |
hkeys key hvals key |
获取哈希表中所有的字段名或字段值 |
hincrby key field increment hincrbyfloat key field increment |
设置指定字段的数值数据增加指定范围的值 |
hsetnx key field value | 用于为哈希表中不存在的的字段赋值。 如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。 如果字段已经存在于哈希表中,操作无效。 如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令 |
注意事项:
有序;
可以存储多个数据并对数据进入存储空间的顺序进行区分;
可以保存多个数据,底层使用双向链表存储结构实现;
基本操作:
操作命令 | 命令功能 |
lpush key value1 [value2] ... rpush key value1 [value2] ... |
从链表左边插入数据 从链表右边插入数据 |
lrange key start stop |
获取列表指定范围内的元素,0 表示列表的第一个元素,-1表示最后一个元素 |
lindex key index | 通过索引获取列表中的元素 |
llen key | 获取列表长度 |
lpop key rpop key |
移出并获取列表的左边第一个元素; 移出并获取列表的右边第一个元素; |
扩展操作:
操作命令 | 命令功能 |
blpop key1 [key2] timeout
|
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
brpop key1 [key2] timeout | 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
lrem key count value | 移除列表中与参数 VALUE 相等的元素。 COUNT 的值可以是以下几种:
|
注意事项:
可以存储大量数据,在查询方面提供更高的效率;
与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的(hashSet)。
基本操作:
操作命令 | 命令功能 |
sadd key menber1 [menber2] | 向集合添加一个或多个成员 |
smenbers key | 返回集合中的所有成员 |
srem key menber1 [menber2] | 移除集合中一个或多个成员 |
scard key | 获取集合的成员数 |
sismenber key menber | 判断 member 元素是否是集合 key 的成员 |
扩展操作:
操作命令 | 命令功能 |
srandmenber key [count] | 返回集合中一个或多个随机数 |
spop key | 移除并返回集合中的一个随机元素 |
Tip: redis 应用于随机推荐类信息检索,例如热点歌单推荐、热点新闻推荐、热卖旅游路线、应用APP推荐等。
操作命令 | 命令功能 |
sinter key1 [key2] | 求两个集合的交集 |
sunion key1 [key2] | 求两个集合的并集 |
sdiff key1 [key2] | 求两个集合的差集 |
sinterstore destination key1 [key2] | 返回给定所有集合的交集并存储在 destination 中 |
sunionstore destination key1 [key2] | 返回给定所有集合的并集并存储在 destination 中 |
sdiffstore destination key1 [key2] | 返回给定所有集合的差集并存储在 destination 中 |
smove source destination member | 将 member 元素从 source 集合移动到 destination 集合 |
注意事项:
应用场景:
Tip:redis应用于同类型数据的快速去重。
数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式;
相当于在set的存储结构基础上添加了可排序字段;
基本操作:
操作命令 | 命令功能 |
zadd key score1 member [score2 menber2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
zrang key start stop [WITHSCORES] | 通过索引区间返回有序集合指定区间内的成员 |
zrevrang key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到低 |
zrem key member [menber...] | 移除有序集合中的一个或多个成员 |
zrangebyscore key min max [WITHSCORES] [LIMIT] | 通过分数返回有序集合指定区间内的成员 |
zrevrangebyscore key max min [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到低 |
zremrangebyrank key start stop | 移除有序集合中给定的排名区间的所有成员 |
zremrangebyscore key min max | 移除有序集合中给定的分数区间的所有成员 |
zcard key | 获取有序集合的成员数 |
zcount key min max | 计算在有序集合中指定区间分数的成员数 |
zinterstore destination numkeys key [key ...] | 计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination |
zunionstore destination numkeys key [key...] | 计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination |
注意:
扩展操作:
操作命令 | 命令功能 |
zrank key member | 返回有序集合中指定成员的索引 |
zrevrank key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
zscore key member | 返回有序集中,成员的分数值 |
zincrby key increment member | 有序集合中对指定成员的分数加上增量 increment |
注意事项:
key是一个字符串,通过key获取redis中保存的数据
操作命令 | 命令功能 |
del key | 删除指定key |
exists key | 获取key是否存在,若 key 存在返回 1 ,否则返回 0 |
type key | 获取key的类型 |
操作命令 | 命令功能 |
expire key seconds | 为给定 key 设置过期时间,以秒计。 |
pexpire key milliseconds | 设置 key 的过期时间以毫秒计。 |
expireat key timestamp | EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 |
pexpireat key milliseconds-timestamp | 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 |
ttl key | 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 |
pttl key | 以毫秒为单位返回 key 的剩余的过期时间。 |
persist key | 移除 key 的过期时间,key 将持久保持。 |
操作命令 | 命令功能 |
keys pattern | 查找所有符合给定模式( pattern)的 key 。 |
操作命令 | 命令功能 |
rename key newkey | 重命名一个key。当 OLD_KEY_NAME 和 NEW_KEY_NAME 相同,或者 OLD_KEY_NAME 不存在时,返回一个错误。 当 NEW_KEY_NAME 已经存在时, RENAME 命令将覆盖旧值。 |
renamenx key newkey | 仅当 newkey 不存在时,将 key 改名为 newkey 。 |
sort | 对所有key排序() |
help @generic | 其他key通用操作 |
在redis中,key是由程序员定义的,伴随着操作数据量的增加,会出现大量数据以及对应的key,数据不区分种类,类别混杂在一起,极容易出现重复或冲突
解决办法:
操作命令 | 命令功能 |
select index | 切换数据库 |
quit | 退出 |
ping | 测试数据库连通性 |
echo message | 打印信息 |
move key db | 移动数据到某一个数据库 |
dbsize flushdb flushall |
数据清除 |
Jedis jedis = new Jedis("localhost",6379);
jedis.set("name","Ben");
jedis.get("name");
jedis.close();
JedisPool:Jedis提供的连接池技术
poolConfig:连接池配置对象
host:redis服务地址
port:redis服务端口号
public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, final int port) {
this(poolConfig, host, port, Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE, null);
}
public class JedisUtils {
public static Jedis getJedis() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(30);//最大连接数
config.setMaxIdle(10);//活动连接数
JedisPool jp = new JedisPool(config,"127.0.0.2",6379);
return jp.getResource();
}
public static void main(String[] args) {
Jedis jedis = JedisUtils.getJedis();
jedis.set("name","hello");
String name = jedis.get("name");
System.out.println(name);
//3,。关闭连接
jedis.close();
}
}