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
//把值加加10 incr views 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 setex key1 30 "xxx" //如果不存在设置值,存在则不设置 setnx (set if noexist)
//设置多个值(many)可无限多
mset k1 v1 k4 v4
//如果不存在设置,是原子性的存在(一个失败全部失败)
msetnx k1 v1 k4 v4
//!!!设置对象,可用对象
set user:1 {name:xxx,age:3}
//设置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 aaa lpush bbb //从右边开始插入 rpush aaa //获取所有list的值,redis不区分大小写 lrange list 0 -1 //移除左边或右边的第一个值 lpop list rpop list
//通过下标获取值 l index lindex list 1 //list长度 llen list //移除指定的值,移除1个 lrem list 1 one //截断值, 保留下标的范围[1,2](从0开始) ltrim list 1 2 //移除列表后,移动到另外一个列表中 //先右边出栈后 输出到另外一个元素的左边 //第一个是源栈 第二个是目标栈(不存在) rpoplpush mylist des
//如果存在值 设置指定下标的值被替换,不存在报错 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 //随机删除key spop myset //移动指定值到另外一个set中 smove set1 set2
//共同关注,求差集 sdiff key1 key2s //交集 sinter key1 key2s //并集 sunion key1 key2
6.hash(重要) key-map(k1 v1 k2 v2)
//添加,值 键值 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基础上
//必须带序号 zadd myset 1 one //设置多个 zadd myset 2 two 3 three //排序数字,从正无穷到负无穷,从小到大,加上排序的序号 zrangebyscore salary -inf +inf withscore //2500以下,从小到大 zrangebyscore salary 2500 -inf withscore //从大到小 zrevrange salary 0 -1 //查看所有元素 zrange salary 0 -1 //移除元素 zrem salary xxx //判断在区间的个数 zcount myzset 1 3 //可以应用在排行榜
----三种特殊数据类型----
8.geospatial(地理位置)
//查询附近的人,两地的距离
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
//指定经度纬度 500km的定位,直线距离
georadius china:city 110 30 500 km
//根据成员名字来查询
georadiusbymember china:city shangehai 100km
//了解,把二维的(两个值)经纬度转换为一维
//的(一个值)经纬度,一样就是距离一样
geohash china:city beijing chongqi
//查看所有数据
zrang china:city 0 -1
//底层还是使用zset,可用zset来移除
zrem china:city beijing
8.hyperloglog
1.基数(分别在两个集合中不重复的元素的个数)(有一定误差)
A={1,2,3,4,5,5} 为4
B={1,2,3,4} 可以接受误差
2.网页的uv(网站统计数据)
传统方式使用set,(不重复),保存大量用户id,我们是要统计
3.优点,只需要 12kb,使用的内存是固定的
4.使用
// 添加元素
pfadd key1 a b c
//查看元素个数
pfcount key1
//合并两个集合的值,并到的目标, 源,得基数,变成一个集合
//,也就是全部值只算一次
pfmerge mykey3 key2 key1
9.bitmap(按位存储的)(两个状态的可以使用)
场景: 统计用户状态, 打卡,疫情统计
位图,是数据结构
//是 键(0-....)和值(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



