1.redis的作用
1.数据库,缓存,mq消息中间件
2.redis-key(避免用中文)
//是否存在这个键
exists name
//移除
del aaa
//设置过期时间,时秒
EXPIRE name 10
//查看的时间
ttl name
//判断key的类型
type xxx
//官网的命令可以查看(搜索)
3.String类型
//追加字符串,如果key不存在,则是set key
APPEND key1 "hello"
//设置值
set key1 v1
//得到
get key1
//把值加加1
incr views
//把值加加10
incrby views 10
//浏览量-1,减10(java步长,减量)
decr views
//decrby views 10
//截取字符串
getrange key1 0 3 // [0,3]
//得到所有字符串
getrange key1 0 -1
//修改字符串通过范围(在字符串之间插入数据)
setrange key1 1 xx
//重要,如果设置过期时间(expire)和值,ttl, 设置一个值 然后30秒后过期
setex key1 30 "xxx"
//如果不存在设置值,存在则不设置值
setnx
//设置多个键和值(many)可无限多,每一个都可以get到,相当于 set k1 v1
//set k2 v2
mset k1 v1 k4 v4
//如果不存在设置,是原子性的存在(一个失败全部失败)
msetnx k1 v1 k4 v4
//!!!设置对象,可用对象 keys user*可以得到全部对象
set user:1 {name:xxx,age:3}
//设置2个map
mset user:1:name jams user:1:age 2
//得到多个map
mget user:1:name user:1:age
//先get后set,不存在值nil
getset aa xx
//jRedis...
4.list(可以变为栈和队列)
//栈是入栈使用lpush,出栈也使用lpush
//从左边开始插入
lpush list aaa
lpush list bbb
//从右边开始插入
rpush list aaa
//获取所有list的值,redis不区分大小写
lrange list 0 -1
//移除左边或右边的第一个值
lpop list
rpop list
//通过下标获取值 l index(从0开始)
lindex list 1
//list长度
llen list
//移除指定的值,移除1个
lrem list 1 one
//截断list(删除), 保留下标的范围(1,2](从0开始)
ltrim list 1 2
//剪切list
//移除列表后,移动到另外一个列表中
//先右边出栈后 输出到另外一个元素的左边
//第一个是源栈 第二个是目标栈(不存在)
rpoplpush mylist des
//不存在lpoprpush
//如果存在值 设置指定下标的值被替换,不存在报错 ,最左边有值则设置相当于 left list set
lset list 0 valxxx
//在指定的值前面插入值,指定的值和插入的值, 键|值
linsert mylist after "aaa" "befVal" //before
linsert mylist after "aaa" "befVal" //before
//是一个链表
5.set(集合)值不能重复,无序,
//添加值(每放入一次,每次存入,存放顺序可能会不同,每个值都是唯一的)
sadd mset "hello"
//查看所有值
sMembers myset
//判断值是否在set中
sismember myset aaa
//得到个数
scard myset
//移除指定值(顺序不会改变)
srem myset hello
//抽奖程序,获取指定个数的值
srandmember myset 3
//随机删除key
spop myset
//剪切,移动指定值到另外一个set中
smove set1 set2 aa
//共同关注,求差集,最好 大的在前 ,小的在后,不然返回空
//不同之处, hello 1 2 3 和 hello 1 4,差在2,3,不管
//两个集合,以第一个集合为参照,的不同之处
sdiff key1 key2s
//交集,两个集合共同部分
sinter key1 key2s
//并集,就是两个集合合并起来
sunion key1 key2
6.hash(重要)(hashmap,和hashset) key-map(k1 v1 k2 v2),得到值还需要 key 和map.key, hash和set都不可以重复
hash有序,set无序
//key不能重复
//添加,值 键值 ,比map多了一个名字
hset myhash field1 value1
//得到一个字段值
hget myhash field1
//设置多个值
hmset myhash field1 value1 field2 value2
//得到多个值
hget myhash field1 field2
//得到所有值
hgetall myhash
//删除hash中的一个key
hdel myhash field1
//得到key/value长度
hlen myhash
//获取所有keys
hkeys myhash
//获取所有values
hvals myhash
//增长-1 对指定的字段
hincrby myhash field3 -1
//如果不存在就设置值 not exist
hsetnx myhash field4 xxx
//设置对象 ,hash更适合对象的存储
hset aaa:11 111 name
hget aaa:11 111
7.zset(有序集合) 在set基础上
zset是有序的,而set是无序的。
//必须带序号
zadd myset 1 one
//设置多个
zadd myset 2 two 3 three
//排序数字,从正无穷到负无穷,从小到大,加上排序的序号
zrangebyscore salary -inf +inf withscores
//2500以下,从小到大
zrangebyscore salary -inf 2500 withscores
//从大到小得到工资对应的人名 reverse range
zrevrange salary 0 -1
//查看所有元素
zrange salary 0 -1
//移除元素,通过值
zrem salary jack
//判断在区间的个数
zcount myzset 1 3
//可以应用在排行榜
----三种特殊数据类型----
8.geospatial(地理位置)space
//查询附近的人,两地的距离
1.要录入数据 百度城市经度纬度、
//添加地理位置 经度 纬度 城市名
geoadd china:city 116.60 39.90 beijing ...可加多个
//南极北极无法直接添加,导入数据一般用java一次性导入
//得到位置,(键值)
geopos china:city beijing
//两个位置的距离,单位 km m ft ...
geodist china:city beijing shanghai km
//查看附近的人,把定位更新,通过半径来查询(圆)
//按照半径的值来查询,限定几个,radius半径
// georadius china:city count 3 报错
//限制条数 ,经度 纬度 100为半径的城市
//georadius china:city 100 30 100 km count 3
//指定经度纬度 500km的定位,直线距离
georadius china:city 110 30 500 km withdist
//根据成员名字来查询附加100km的城市
georadiusbymember china:city shanghai 10 km
//了解,把二维的(两个值)经纬度转换为一维
//的(一个值)经纬度,一样就是距离一样
geohash china:city beijing chongqi
//查看所有数据
zrange china:city 0 -1
//底层还是使用zset,可用zset来移除
zrem china:city beijing
8.hyperloglog (super log->wood)
1.基数(分别在两个集合中不重复的元素的个数)(有一定误差)
A={1,2,3,4,5,5} 为4个,是1,2,3,4
B={1,2,3,4} 可以接受误差
2.网页的uv(网站统计数据)
传统方式使用set,(不重复),保存大量用户id,我们是要统计
3.优点,只需要 12kb,使用的内存是固定的
4.使用(pf是作者的名字)Philippe Flajolet
// 添加元素
pfadd key1 a b c
//查看元素个数
pfcount key1
//合并两个集合的值,并到的目标, 源,得基数,变成一个集合 合并两个集合 如 1 2 3和1 2 3 4合并为1 2 3 4算出是4
//,也就是全部值只算一次
pfmerge mykey3 key2 key1
//查看元素个数
pfcount mykey3
9.bitmap(按位存储的)(两个状态的可以使用)
//是调试zset
场景: 统计用户状态, 打卡,疫情统计
位图,是数据结构
//是 键0和值1
setbit sign 0 1
//去统计一周每一天的打卡
//得到具体哪一天的值
getbit sign 3
//统计1的数量
bitcount sign
10.事务
要么同时成功,同时失败,原子性
!!redis事务单条命令保持原子性,但事务不保证原子性
redis事务的本质:一次性,顺序性,排他性(命令都会被序列化)
redis:没有隔离级别的概念(就是不直接执行,要等执行)
redis是一次性执行的
过程:
//开启事务()
multi
//命令入队()
set k1 v1
set k2 kv
get k2
//执行事务()
exec
//取消事务,命令都不执行
discard
//编译型异常(代码有错,全部不执行)
//运行时异常(存在先后顺序,可以继续执行下面的语句)
//字符串加+运行时异常(mysql事务没有原子性)
set k1 "v1"
multi
incr k1
discard