基础部分
1:简介
redis是一个高性能的key-value数据库,不过与传统数据库不同的是redis的数据是存在内存中的,所以读写速度非常快。可以用做数据库、缓存和消息中间件,不区分大小写命令
2:redis启动
redis-server redis.conf:启动redis
redis-cli -p 6379:使用redis客户端进行连接
ps -ef|grep redis:查看当前进程数量
3:redis关闭
shutdown:关闭redis
exit:退出redis
五大数据类型
1:Redis-key的基本命令
keys * :查看当前数据库所有的key
exists name:查看数据库是否存在名称为name的key
move name 1:将名称为name的key从当前数据库移动到数据库1
expire name 10:设置名称为name的key10秒钟后过期
ttl name:查看名称为name的key的剩余时间
type name:查看名称为name的key的数据类型
2:String(字符串)
set name gaojie:设置name的值
get name:查看name的值
append name shiwo:在name的值的后面追加shiwo进行拼接(如果名称为name的key不存在,则等同于 set name shiwo)
del name:删除键值对name-gaojie
strlen name:获取name的value的长度
incr views:将名称为views的key对应的value值+1(views必须为integer)
decr views:将名称为views的key对应的value值-1(views必须为integer)
incrby views 10:将名称为views的key对应的value值+10(views必须为integer)
decrby views 5:将名称为views的key对应的value值-5(views必须为integer)
getrange name 0 3:获得名称为name的key对应的value的前四个字符
getrange name 0 -1:获得名称为name的key对应的value的全部字符
setrange name 5 xx:将name的第五个字符替换为xx
setex key 30 hello:设置一个key的值为hello,30秒后过期(set with expire)
setnx key1 hello:设置一个key1的值为hello,key1不存在则才能创建,存在则失败(set if not exist)
注意:setnx在分布式锁中常常使用
mset k1 v1 k2 v2 k3 v3 :批量插入k1、k2、k3(存在则更新,不存在则插入)
mget k1 k2 k3:批量查看k1、k2、k3
msetnx k1 v1 k4 v4:批量插入k1、k4,有一个存在则全部失败(原子性操作)因为上面已经插入了k1
保存对象
mset user:1:name zhangsan user:1:age 23 :设置一个对象
mget user:1:name user:1:age:得到对象
getset name gaojie:获取旧值gaojishiwo,再设置新值gaojie
先get再set,如果不存在则返回nil
注意:String类似的使用场景:value除了是我们的字符串还可以是我们的数字
3:List(列表)
Redis里面的list类型其实是每一个子元素都为string类型的双向链表,链表的长度为2^32,list可以用作栈、队列
增
lpush list one:添加元素one(在左边添加)
rpush list rone:添加元素rone(在右边添加)
删
lpop list:把最左边的元素移除
rpop list:把最右边的元素移除
改
lindex list 1:获取list的第2个值(通过下标获取值)
lrem list 1 one:移除list中的一个one值(精确匹配)
ltrim list 1 2 :截断list只保留第2个元素到第三个元素区间(其他元素已经删除)
rpoplpush list mylist:将list右边的第一个元素移动到mylist中
lset list 0 hello:将list中第1个元素的值替换成hello(前提是list必须存在,下标也必须是存在的,不存在就会报错)
linsert list before world value:在list中world元素之前插入value
linsert list after world value:在list中world元素之后插入value
查
lrange list 0 -1:查看list的全部元素
lrange list 0 1:查看list的前2个元素
llen list:返回list的长度
4:Set(集合)
set中的值不允许重复(无序)
增
sadd myset hello:myset中添加hello元素
删
srem myset hello:删除myset中的hello元素
spop myset:随机删除myset一个元素
改
smove myset myset1 a:将a从myset移动到myset2中
查
smembers myset:查看myset所有元素
sismember myset hello:判断myset中是否存在hello元素,返回1表示存在,返回0表示不存在
scard myset:获取myset长度
srandmember myset:随机获取myset中的一个元素(可以用作随机抽奖)
srandmember myset 2:随机获取myset中的2个元素
myset1中为a、b、c,myset2中为c、d、e
sdiff myset1 myset2:输出为b、a,取差集(myset1在前,以myset为标准)
sinter myset1 myset2:输出为c,取交集(可以用作微博、b站的共同关注)
sunion myset1 myset2:输出a、b、c、d、e,取并集
5:Hash(散列)
map集合,其实就是key-(key-value)、本质其实和String类型没有太大区别
增、查
hset user name zhangsan:插入一个user,user里面是name-zhangsan
hget user name:查看user的name的值
hmset user name zhangsan age 23 gender man:同时插入user里面的多个键值对
hget user name age gender:获取user的多个字段的值
hgetall user:获取user的所有字段和值(键和值都展示)
hlen user:获取user中有多少个键值对
hexists user name:判断user中指定的name字段是否存在
hkeys user:获取user中的所有key(name、age、gender)
hvals user:获取user中所有的value(zhangsan、23、man)
改
hincrby user age 1:将user中的age字段的值+1(1为指定的增量)
hsetnx user tel 182:创建user中的tel-182键值对,如果不存在则创建,如果存在则创建失败
删
hdel user gender:删除user中的gender-man键值对
注意:hash更适合存储对象,string更适合存储字符串
6:Zset(有序集合)
在set的基础上,增加了一个顺序属性,每个元素都关联一个duoble类型的score,表示权重,通过权重将元素从小到大排列
增
zadd myset 2500 xiaohong:增加一个值
zadd myset 5000 zhangsan 200 xiaoming:增加多个值
删
zrem salary xiaohong:删除xiaohong
查
zrangebyscore salary -inf +inf:按照salary全部进行升序排序(只显示名称)
zrangebyscore salary -inf +inf withscores:按照salary全部进行升序排序(名称和salary都显示)
zrangebyscore salary -inf 2500 withscores:按照salary将小于2500的进行升序排序(名称和salary都显示)
zrevrange salary 0 -1 :按照salary全部进行降序排序
zcard salary:获取myset中的个数
zcount myset 200 5000:获取集合中200-5000之间的元素个数
注意:可以用来做存储班级成绩表、工资表排序、排行榜应用实现!
三种特殊数据类型
1:geospatial(地理位置)
南北级无法直接添加,一般会下载城市数据,通过java程序一次性导入。
经度范围:-180到+180;纬度范围:-85.05112到+85.05112
增
geoadd china:city 108.96 34.26 xian:添加xian的地理位置(key为china:city,value为经度 纬度 名称)
geoadd china:city 116.40 39.90 beijing 114.05 22.52 shenzhen:添加xian、shenzhen的地理位置
查
geopos china:city xian:获取xian的经度纬度
geopos china:city xian beijing:获取xian、beijing的经度纬度
geodist china:city xian shenzhen km:获取xian、shenzhen之间的距离,单位为km(可以是m、km)---------打车的距离计算
georadius china:city 110 30 1000 km:以110 30 经纬度为圆心,1000km为半径,搜索范围内的城市(城市必须存在在当前集合)-------附近的人
georadius china:city 110 30 1000 km withdist:同时显示距离
georadius china:city 110 30 1000 km withdist count 1:同时显示距离,只显示一个城市
georadius china:city 110 30 1000 km withcoord:同时显示城市经纬度
georadiusbymemeber china:city beijing 1000 km:以beijing为圆心,1000km为半径,搜索范围内的城市(搜索结果包括自己)
注意:geo的底层实现原理就是zset,所以可以使用zset命令来操作geo!
注意:可以用作朋友的定位,附近的人,打车距离计算等
2:hyperloglog(基数统计)
基数:一个可重复的集合中,不重复元素的个数(是可以接受误差的)例如: A{1、3、4、7、8、7} 基数=5
优点:占用的内存是固定的
增
pfadd mykey a b c d e f g h i j:在mykey中增加10个元素
改
pfmerge mykey3 mykey mykey2:将mykey、mykey2集合合并到mykey3中,取并集
查
pfcount mykey:统计mykey中的集合基数数量,10个
注意:可以用作网页的UV(一个人访问一个网站多次,但是还是算作一个人),如果允许容错,可以使用;不允容错,则不能使用,需要使用set或其他的数据类型
3:bitmaps(位存储)
bitmaps位图,数据结构,都是操作二进制位来进行记录,就只有0和1两个状态!
增
setbit sign 0 0:集合统计周天没有打卡(末尾0表示未打卡,1表示打卡)
setbit sign 1 1:增加周一的打卡
查
getbit sign 0:查看周天是否打卡(返回0表示未打卡,1表示打卡了)
bitcount sign:统计打卡次数(末尾为1的次数)
注意:统计用户信息、活跃、不活跃!登录未登录!等两个状态的都可以使用bitmaps