键值数据库介绍
键值数据库表中有特定的key和对应的value存储数据,key用来定位value,即检索和存储具体的value,value对数据库而言是透明不可见的,不能对value进行索引和查询,只能通过key来查询。value可以存储任何类型的数据,包括整型、字符型、数组、对象等。在存在大量写操作的情况下,键值数据库可以比关系型数据库取得明显更好的性能。
键值数据库天生具有良好的伸缩性,理论上可以实现数据的无限扩充。
键值数据库可以进一步划分为内存键值数据库和持久化键值数据库,内存键值数据库把数据保存在内存,如redis就是一个典型的内存键值数据库;持久化键值数据库把数据保存在磁盘。
Redis 运行快速的原因
- 完全基于内存操作
- 数据结构简单,数据操作也简单
- 使用多路I/O复用模型
Jedis
Jedis是redis提供给Java连接redis的一个客户端,我们可以通过Jedis使用Java操作redis,在操作Jedis前,要下载导入Jedis jar包。
Java操作redis的demo可见:【Redis】Java中使用Jedis操作Redis(Maven导入包)、创建Redis连接池,里面还涉及了一个连接池的操作。为什么要使用连接池呢,我的理解是减少Java和redis建立连接的时间开销,连接池可以实现在客户端建立多个连接并且不释放存储在连接池,当需要使用连接的时候通过一定的算法从连接池里获取已经建立的连接,使用完了以后则还给连接池,这就免去了Java和redis建立连接所占用的时间。
redis数据类型
redis的键对应的值支持字符串(strings)、哈希表(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets),位图(bitmaps),hyperloglogs等数据类型
各种数据类型对应的命令操作可见:https://www.redis.net.cn/order/
我个人认为这个网址收集的redis命令还是挺全的,里面除了redis操作各种数据类型对应的命令外,还有redis连接命令、redis服务器命令、redis脚本命令、redis事务命令、redis发布订阅命令和redis 地理位置命令。
String
单条操作
增:set key value
查:get key
删:del key
多条操作
增:mset
key value [key1 value1]
查:mget key [key1]
其他命令
strlen key //获取字符串长度
append key value //有则追加,无则新建
setnx key value //不存在就设置,存在就不设置
incr key //自增 1
incrby key num //给key的值增加num(int 类型),num 正数则为加,num 为负数 则为减
incrbyfloat key num //给key的值增加num(float 类型)
decr key //自减 1
decrby key num //给key的值减num
setex key second value //设置key的值为value存活时间为second秒
psetex key millisecond value //设置key的值为value存活时间为millisecond毫秒
注:
字符串值最大值为512m
Hash
和字符串相似,可理解为字符串厘米套字符串
单条操作
增:hset key field value
查:hget key field
删:hdel key field
多条操作
增:hmset key field value [field1 value2]
查:hmget key field [field1]
其他命令
hgetall key //获取key的全部的值
hlen key //获取key的值的数量
hexists key field //是否存在field
hkeys key //所有key的字段(field)
hvals key //所有key的值
hincrby key field num //给key的field的值增加num (num 为int值)
hincrybyfloat key field num //给key的field的值增加num (num 为float)
hsetnx key field value //存在不设置,不存在设置
注:
-
Hash类型的value只能存字符串,不允许再嵌套其他类型,如果数据为空为Nil
-
每个Hash可以存储2的32次方 −1个键的值对
-
Hash类型十分贴近对象的数据存储,并且可以灵活添加、删除对象属性。但Hash类型设计并不是存在量而设计的,切记不可滥用,更不可将Hash作为对象列表使用
-
hgetall操作可以获取全部属性,如果内部field过多,遍历整体数