概念
什么是Redis?
Reids是开源、支持网络、基于内存、可持久化的键值对存储的非关系型数据库。默认端口号为6379。
应用场景
缓存、排行榜、计数器(incr|decr)、分布式会话、分布式锁、社交网络、最新列表、消息系统
基本数据类型
string、list、set、hash、zset(有序的set)
特殊数据类型get
geospatial:地理位置
hyperloglog:基数统计
bitmap:位图0/1,适用描述于只有两种状态
常用命令
在redis判断命令中,返回1代表真,0代表假;redis命令不区分大小写
辅助命令
select 数据库序号,以0为起始,切换数据库,redis默认有16个数据库
dbsize 查看数据库使用的大小
keys * 查看所有的键
flushdb 清空当前数据库
fulushall 清空所有数据库
expire key 10 使用key在10s后失效
move key db 将当前数据库的key移动到另一个db
del key1 key2 ... 删除key
type key 查看key对应value的类型
exists key 是否存在key
string
字符串
set key value
get key value
mset key1 value1 key2 value2 ...
mget key1 key2 ...
getrange key 0 3 获取[0,3]范围的字符串,如"123456"得"1234"
setnx key value 不存在该key才可以设置,分布式锁常用到
setex key 3 value 设置临时key,3s后失效
append key value 在原key对应的值追加value
strlen key 查看该key对应的value的长度
incr key key对应的value自增1
decr key 自减1
incrby key step 自增step
decrby key step 自减step
list
有序、重复的数据结构
lpush list value1 value2 ... 头插入
rpush list value1 value2 ... 尾插入
lrange list 0 -1 遍历 0 1查看第一个和第二个
lpop list 去头
rpop list 去尾
lindex list 0 查看下标为0的元素
llen list 获取长度
lrem list count element 删除指定个数的指定元素
ltrim list 0 1 截取[0,1]
lset list 2 value 修改下标为2的元素的值为value
linsert list before/after 3 value 在值为3之前/之后插入value
set
无序、不可重复的数据结构
sadd set value1 value2 ...
smembers set 遍历
sismemeber set value 判断value是否在集合中
scard set 获取集合元素的个数
srem set value1 value2 ... 删除元素
srandmember set count 随机获取count个元素
spop set count 随机删除count个元素
smove set1 set2 3 将set1中的3移动到set2
###########################
以set1为基准
sdiff set1 set2 ... 求差集
sinter set1 set2 ... 求交集
sunion set1 set2 ... 求并集
###########################
hash
存储key-value的数据结构,适用于存储对象
hset hash key value
hget hash key
hmset hash key1 value1 key2 value2 ...
hmget hash key1 key2 ...
hgetall hash 获取所有键值对
hdel hash key 删除键值对
hlen hash 获取键值对个数
hexists hash key 是否存在key
hkeys 获取所有key
hincrby hash key 2 使hash中的key对应的值增加2
hsetnx hash key value 不存在才创建
zset
有序、元素不重复的数据结构
zadd zset index1 value1 index2 value2 ...
zrange zset 0 1 获取[0,1]的元素 [0,-1]遍历
zrem zset value1 value2 ... 删除元素
zcard
三种特殊的数据结构
#################################################################
geospatial 地理位置
geoadd key 经度 纬度 名称
geodist geo 名称1 名称2 m|km 计算距离
geopos geo 名称 获取经纬度
georadius geo 经度 纬度 1000 m|km 获取以该经纬度为中心附近1000m|km的名称
georadiusbymember geo 名称 1000 m|km 以该名称为中心附近的1000m|km的名称
#################################################################
#################################################################
hyperloglog 基数统计
#################################################################
#################################################################
bitmaps 存储0/1两个状态
#################################################################
setbit sign 1
setbit sign 0
setbit sign 2 //error
bitcount sign 1 统计状态为1的个数
Redis事务
概念
本质上就是一组命令的集合,一个事务会经历三个步骤:开始事务、命令入队、执行事务。
redis不存在隔离级别的概念。
执行情况分为三种
- 编译器错误,所有命令都不执行(如命令语法错误)
- 运行期错误,发生错误的命令不执行其余执行(如set插入了相同元素)
- 都执行成功
命令
- 开始事务:multi
- 执行事务:exec
- 取消事务:discard
Redis实现乐观锁
演示 (watch/unwatch)
###############################################
初始化数据
set money 100 //假设有100块
set expenses 0 //消费金额
###############################################
###############################################
线程1
watch money //开始监视,相当于为money加了乐观锁
multi //开启事务
incrby expenses 10 //消费了10块
decrby money 10 //余额减少10块
// exec 假设此时还来得及执行该事务,线程2已经修改了money
###############################################
###############################################
线程2
set money 300
###############################################
###############################################
线程1
exec 执行事务时返回nil,表示事务执行失败
###############################################
unwatch 如果之前已经watch了,先执行该命令取消监视,再watch
Jedis
概念
Jedis是官方提供的Java连接Redis开发工具,使用Java操作Redis
导入依赖
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
使用方式和命令一样的
Jedis jedis = new Jedis("127.0.0.1", 6379);
System.out.println(jedis.ping());
System.out.println(jedis.set("key", "value"));
System.out.println(jedis.get("key"));
jedis.close();