Redis详解

Redis基本知识

redis-server #启动redis服务

在这里插入图片描述

shutdown #停止redis服务

在这里插入图片描述

redis-cli -p 6379 #使用redis客户端进行连接

在这里插入图片描述
使用redis客户端的命令

keys * #查看所有key

在这里插入图片描述

flushdb #清空当前数据库的内容
flushall #清空所有所有数据库的内容
select 3 #切换数据库
DBSIZE #查看DB大小

redis-benchmark性能测试

redis-benchmark -h localhost -p 6379 -c 100 -n 100000

Redis是单线程的!

官方表示,Redis基于内存操作,CPU不是Redis的性能瓶颈

Redis是C语言写的,官方提供的数据为100000+的QPS,完全不比同样是使用key-value的Memecache差!

Redis 为什么单线程还这么快?

1、误区1:高性能的服务器一定是多线程的?

2、误区2:多线程(CPU上下文会切换!)一定比单线程效率高!

先去CPU>内存>硬盘的速度要有所了解!

Redis-Key

EXISTS name #判断当前的Key是否存在
move name 1 #移除当前的Key
EXPIRE name 10 #设置Key的过期时间为10秒
ttl name #查看当前key的过期时间
type name #查看当前key的类型

String(字符串)

set key1 v1 #设置值
get key1 #获得值
EXISTS name #判断当前的Key是否存在
APPEND key1 "hello" #追加字符串,如果当前的key不存在,则相当于setkey
STRLEN key1 #获取字符串的长度
set views 0 #初始浏览量为0
incr views #自增1 浏览量变为1
decr views #自减1 浏览量变为0
INCRBY views 10 #可以设置步长,指定增量!
#字符串范围 range

GETRANGE key1 0 3 #截取字符串 [0,3]

GETRANGE key1 0 -1 #截取全部字符串 (与get key1一样)
#替换  
SETRANGE key2 1 xx #替换指定位置开始的字符串!
setex(set with expire) #设置过期时间
setnx(set if exist) #不存在再设置 (在分布式锁中会常常使用)

setex key3 30 "hello" #设置key的值为hello,30秒后过期

setnx mykey "redis" #如果mykey不存在,创建mykey

setnx mykey "MongoDB" #如果mykey存在,创建m失败
#mset  mget

mset k1 v1 k2 v2 k3 v3 #同时创建多个值

mget k1 v1 k2 v2 k3 v3 #同时获取多个值

msetnx k1 v1 k4 k4 #msetnx是一个原子性的操作,要么一起成功,要么一起失败
#对象
set user:1 {name:zhangsan,age:3} #设置一个user:1 对象 值为json字符来保存一个对象!

mset user:1:name zhangsan user:1:age 2 #设置多个对象值

mget user:1:name user:1:age #获取多个对象值
#getset

getset db redis #如果不存在,则返回nil,并设置值

getset db mongodb #如果存在值,获取原来的值,并设置新的值

List(列表)

LPUSH list one #将一个值或者多个值,插入到列表头部(左)

RPUSH list one #将一个值或者多个值,插入到列表头部(右)

LRANGE list 0 -1 #获取list中值

LRANGE list 0 1 #获取list中具体的值

###################################################

LPOP list #移除list的第一个元素(左)

RPOP list #移除list的第一个元素(右)

LINDEX list 0 #通过下标获得list中的某一个值!

Llen list #返回列表的长度

lrem list 1 three #移除list集合中指定个数的value,精确匹配
#trim

ltrim mylist 1 2 #通过下标截取指定的长度,这个list已经被改变,截断了其它元素只剩下截取的元素!
#rpoplpush 移除列表的最后一个元素,将他移动到新列表中

rpoplpush mylist myotherlist #移除列表的最后一个元素,将他移动到新列表中
lset #将列表中指定下标的值替换为另一个值,更新操作

lset list 0 item #如果不存在列表我们去更新就会报错

lset list 0 item #如果存在,更新当前下表的值
linsert #将某个具体的value插入到列把你某个元素的前面或者后面!

linsert mylist before "world" "other" (前面)

linsert mylist after "world" "new" (后面)

Set(无序不重复集合)

sadd myset "hello" #set集合中添加元素

SMEMBERS myset #查看指定set的所有值

SISMEMBER myset hello #判断某一个值是不是在set集合中

scard myset #获取set集合中内容元素个数

srem myset hello #移除set集合中的指定元素

srandmember myset #随机抽选出一个元素

srandmember myset 2 #随机抽选出指定个数的元素

spop myset #随机删除一些set集合中的元素

smove myset myset2 "kuangshen" #将一个指定的值移动到另外一个set集合中

SDIFF key1 key2 #差集

SINTER key1 key2 #交集 共同好友就可以这样实现

SUNION key1 key2 #并集

Hash

hset myhash field1 change #set一个具体key-value

hget myhash field1 #获取一个字段值

hmset myhash field1 change field2 hello #set多个key-value,如果value存在会被覆盖,与String同理

hmget myhash field1 field2 #获取多个字段值

hgetall myhash #获取全部的数据

hdel myhash field1 #删除hash指定的key字段,对应的value值也会随之消失

hlen myhash #获取hash表的字段数量

hexists myhash field1 #判断hash里的指定字段是否存在

hkeys myhash #只获得所有field

hvals myhash #只获得所有value

hset myhash field3 5 #指定增量

HINCRBY myhash field3 1 #为hash指定的字段增加数量

HINCRBY myhash field3 -1 #为hash指定的字段减少数量

hsetnx myhash field4 hello #如果不存在则可以设置

hsetnx myhash field4 world #如果存在则不能设置

hset user:1:name zhangsan user:1:age 2 #设置多个对象值

hget user:1:name user:1:age #获取多个对象值

Zset (有序集合)

zadd myset 1 one #添加一个值

zadd myset 1 one 2 two #添加多个值

zrange myset 0 -1 #获取所有的值

zrangebyscore salary -inf +inf #显示全部的用户 从小到大

zrevrange salary 0 -1 #显示全部的用户 从大到小

zrangebyscore salary -inf +inf withscores #显示全部的用户 并且附带工资

zrangebyscore salary -inf 2500 withscores #显示工资小于2500员工的升序排序

zrem salary change #移除有序集合中的指定元素

zcard salary #获取有序集合的个数

zcount myset 1 2 #获取指定区间的成员数量

三种特殊数据类型

geospatial 地理位置

GEOADD

# getadd 添加地理位置
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 150.45 22.23 chongqing 
(integer) 1

GEOPOS

127.0.0.1:6379> geopos china:city beijing #获取指定的城市的经度和纬度
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"

GEODIST

两人之间的距离!

单位:

· m 表示单位为米

· km 表示单位为千米

· mi 表示单位为英里

· ft 表示单位为英尺

127.0.0.1:6379> geodist china:city beijing shanghai km #查看上海到北京的直线距离
"1067.3788"

GEORADIUS

GEORADIUS china:city 121 31 1000 km #以121,31为中心,寻找方圆1000km内的城市
127.0.0.1:6379> georadius china:city 121 31 500 km
1) "shanghai"

georadius china:city 121 31 500 km withdist #显示到中间距离的位置
127.0.0.1:6379> georadius china:city 121 31 500 km withdist
1) 1) "shanghai"
   2) "51.5509"
   
georadius china:city 121 31 500 km withcoord #显示他人的定位信息
127.0.0.1:6379> georadius china:city 121 31 500 km withcoord
1) 1) "shanghai"
   2) 1) "121.47000163793563843"
      2) "31.22999903975783553"
      
georadius china:city 121 31 500 km withdist withcoord count 1
#筛选出指定的结果!
127.0.0.1:6379> georadius china:city 121 31 500 km withdist withcoord count 1
1) 1) "shanghai"
   2) "51.5509"
   3) 1) "121.47000163793563843"
      2) "31.22999903975783553" 

GEORADIUSBYMEMBER

#找出位于指定元素周围的其他元素!
georadiusbymember china:city beijing 1000 km
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "beijing"                                                            

GEOHASH 命令 -返回一个或多个位置元素的GEOHASH表示

#将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么距离越近
geohash china:city beijing
127.0.0.1:6379> geohash china:city beijing
1) "wx4fbxxfke0"

GEO底层的实现原理其实就是Zset 我们可以使用Zset命令来操作GEO

zrange china:city 0 -1
127.0.0.1:6379> zrange china:city 0 -1
1) "shanghai"
2) "beijing"
3) "chongqing"

zrem china:city beijing #移除指定元素

Hypeloglog 统计不重复

PFADD mykey
PFADD mykey a b c d e f g h i j #创建第一组元素 mykey
PFCOUNT mykey #统计mykey并集数量
#因为第一组不存在重复的值,因此统计出的并集数量为10

PFADD mykey2 i j z x c v b n m #创建第二组元素 mykey2
PFCOUNT mykey2 #统计mykey2并集数量

PFNERGE mykey3 mykey mykey2 #使用mykey3将mykey和mykey2整合在一起并统计

PFOUNT mykey3 #再次统计并集数量

如果允许容错,那么一定可以使用Hypeloglog!

如果不允许容错,就使用set或者自己的数据类型即可!

Bitmap

位存储

统计用户信息,活跃,不活跃!登录、未登录!打卡、365打卡!两个状态的,都可以使用Bitmap!

Bitmap 位图,数据结构!都是操作二进制来进行记录,就只有0和1两个状态!

365 天 = 365 bit 1字节 = 8bit 46个字节左右!

使用bitmap来记录 周一到周日的打卡!
周一:1 周二:0 周三:0 周四:1 ...
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> set
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值