Redis五种基本数据类型及三种特殊数据类型

基础部分

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值