Redis-基础

一、Redis入门

1、概念

Remote Dictionary Server 远程字典服务。结构化数据库,当今热门的NoSql数据库,可以支持主从复制、持久化,读写速度快,基本所有语言都支持。

  • 内存存储,持久化(rdb、aof )
  • 效率高,用于高速缓存
  • 发布订阅系统,可以最简单的消息队列
  • 地图信息分析
  • 计数器、计时器(数据分析、浏览量!)
  • 多样的数据类型,支持集群、事务等

学习中需要使用到的东西:
redis官网、GitHub开源地址

二、Linux下载

1、安装

# 1、下载安装包
$ wget https://download.redis.io/releases/redis-6.2.6.tar.gz
# 2、移动到opt目录
$ mv redis-6.2.6.tar.gz /opt
# 3、切换到opt目录
$ cd /opt
# 4、解压 
$ tar xzf redis-6.2.6.tar.gz
$ cd redis-6.2.6
# 5、安装基础环境
$ yum install gcc-c++
# 6、配置需要的相关文件
$ make
# 7、确认安装
$ make install 
# 8、拷贝配置文件进行配置
$ pwd
/usr/local/bin
$ find / -name redis.conf
/root/redis-6.2.6/redis.conf
$ mkdir k-redis.conf
$ cp /root/redis-6.2.6/redis.conf k-redis.conf
$ cd k-redis.conf/
$ ls
redis.conf
# 9、配置后台启动:配置文件 daemonize 改为yes
# 10、使用新的配置文件启动redis 
$ redis-server k-redis.conf/redis.conf 
$ src/redis-server
# 11、使用内置的客户端与Redis通讯:
$ redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name kanlina
OK
127.0.0.1:6379>

2、配置文件

  • 原redis配置文件:/root/redis-6.2.6/redis.conf
  • 更改后的配置文件路径:/usr/local/bin/k-redis.conf/redis.conf

3、服务相关路径

  • redis默认安装路径:/usr/local/bin/redis-server

4、相关命令

  • 查看redis进程: ps -ef|grep redis

  • 关闭redis命令:进入redis-cli :shutdown exit

三、redis性能测试-redis-benchmark

1、测试100个并发连接,每个并发10w请求

在这里插入图片描述

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

在这里插入图片描述

四、基础知识

1、redis数据库和key的基础操作

redis默认有16个数据库,默认使用第0数据库,可以使用select num切换数据库,dbsize 查看数据库内的大小,使用keys * 查看数据所有的key,flushall 清空所有key,FLUSHDB清除该数据库里的所有key。

127.0.0.1:6379> select 0
OK
127.0.0.1:6379> dbsize
(integer) 5
127.0.0.1:6379> keys *
1) "key:__rand_int__"
2) "myhash"
3) "mylist"
4) "name"
5) "counter:__rand_int__"
127.0.0.1:6379> get name
"kanlina"
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> keys *
(empty array)

2、redis单线程

redis是基于内存操作的,cpu不是性能瓶颈,redis的瓶颈是机器的内存和网络带宽,所以可以使用单线程实现就是用单线程了。

  • redis单线层为什么还这么快?
1、误区1:高性能的一定是多线程
2、误区2:多线程(cpu上下文会切换!)一定比多线程效率高!
了解CPU>内存>硬盘的速度

核心:redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时操作!),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的,在内存情况下,这个就是最佳方案。

3、key基础命令

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库缓存消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询. Redis 内置了 复制(replication), LUA脚本(Lua scripting), LRU驱动事件(LRU eviction), 事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel) 和自动 分区(Cluster)提供高可用性(high availability。

# 1、设置key
set key value
# 2、查看key是否存在
EXISTS key 
# 3、移除key到指定数据库
move key db 
# 4、设置过期时间
EXPIRE key seconds
# 5、查看key剩余时间 -1永久有效;-2已过期
#单点登录可以将token存储到redis中
ttl key
# 6、查看key类型
type key

可以查看官网相关文档,有很多命令可以直接去查看:https://www.redis.com.cn/commands.html

五、基本数据类型

1、String

使用场景:计数器、统计多单位的数量、粉丝数、对象缓存存储!list实际上是一个链表

# 1、给key的值拼接字符串,如果当前key不存在,就相当于set了一个key
 APPEND key value
# 2、查看key长度
 STRLEN key 
# 3、设置值
set key value
# 4、获取值
get key 
# 5、自动+1,例如浏览量可以使用该方法
INCR key
# 6、自动-1
DECR key
# 7、按照自定义自增/自减 设置步长指定增量
INCRBY/DECRBY key increment
# 1、按照范围查看字符串 -1所有
GETRANGE key start end
# 2、根据索引替换 字符串
SETRANGE key offset value
# 3、如果当前存在设置生效
setex key seconds value
setex setkey 10 "setkeyvalue" 
# 4、如果当前不存在设置才生效 分布式锁中经常使用 0-设置失败;1-成功
setnx key value
# 5、批量设置
mset key1 vi k2 v2 k3 v3
# 6、批量获取
mget key1 k2 k3
# 7、不存在时批量设置才生效  原子性操作
msetnx key1 value1 k4 v4
# 8、先获取再设置值,如果该key存在则覆盖原值
getset key value

2、List

基本数据类型,列表,在redis中既能当栈又能当队列。所有list命令都是以l
开头,值可以重复。实际上是一个链表,before Node after , left,right都可以插入值,如果key不存在,创建新的链表,key存在新增内容。如果移除了所有值,空链表也代表不存在。在两边插入或者修改值,效率最高,中间元素效率会低。
使用场景:消息队列(Lpush Rpop),栈(Lpush Lpop )

# 1、将值放到列表的头部
$ lpush list one
(integer) 1
$ lpush list tow
(integer) 2
$ lpush list three
(integer) 3
# 2、从头部获取值 lrange list start end  -1:获取所有
$ lrange list 0 -1
1) "three"
2) "tow"
3) "one"
$ lrange list 0 1
1) "three"
2) "tow"
# 3、将值放到尾部
rpush key value

# 4、移除元素
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "tow"
3) "one"
4) "four"
127.0.0.1:6379> lpop list 1 # 移除头部 lpop key count
1) "three"
127.0.0.1:6379> rpop list 1 #移除尾部 rpop key count
1) "four"

# 5、根据索引获取值 redis索引从0开始 
lindex key index
# 6、获取list长度
llen key
# 7、移除key中指定的值
lrem key count value
# 8、截取指定的长度
ltrim key start end 
# 9、移除最后一个元素并存另一个列表中
rpoplpush source otherList
# 10、指定下标值替换为另外一个值 如果key不存在会报错,如果存在会覆盖原先的值 
lset key index element
# 11、向某个key的指定value前面或者后面插入指定的值 pivot: 
linsert key BEFORE|AFTER pivot element
127.0.0.1:6379> lrange mylist 0 -1
1) "hellovalue3"
2) "hellovalue1"
127.0.0.1:6379> linsert mylist before hellovalue1 insetvalue
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hellovalue3"
2) "insetvalue"
3) "hellovalue1"

3、Set

Set中的值是不能重复的!
使用场景:交集、并集、差集
微博和b站的共同关注,A用户将所有关注的人放在一个set集合!将它的粉丝也放在一个集合中,共同关注、共同爱好(六度分割)

# 1、添加元素
sadd key value
127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset hello1
(integer) 1
127.0.0.1:6379> sadd myset hello2
(integer) 1
127.0.0.1:6379> sadd myset hello3
(integer) 1

# 2、获取key的值
smembers key
127.0.0.1:6379> smembers myset
1) "hello2"
2) "hello"
3) "hello3"
4) "hello1"
# 3、查看key里的value是否存在
sismember key value 
127.0.0.1:6379> sismember myhello hello
(integer) 0
127.0.0.1:6379> sismember myset hello
(integer) 1
127.0.0.1:6379> sismember myset hell
(integer) 0
# 4、查看key大小
scard key
# 5、移除key中的value
sre m key value 
# 6、随机抽取指定个数的元素
srandmember key [count]
# 7、随机删除元素
 spop key [count]
# 8、将指定值移除到另外的集合中
smove source otherSet value
# 1、差集 以key1为准,其他集合内没有key1的一些值
sdiff key1 [key2 ...]
# 2、交集 以key1为准,其他集合和key1一样的元素 
sinter key [key ...]
# 3、并集
sunion key [key ...]

4、Hash

一个map集合,之前存在的是key-value模式,hash的value是一个map集合。本质和String类型没有太大区别,只是vaue为map形式。
使用场景:hash变更的数据,尤其是用户信息的保存,更适合对象的存储,String适合json或者字符串的存储。

# 1、添加值
hset key field value [field value ...]
# 2、批量添加
hmset key field value [field value ...]
# 3、获取值
hget key field
# 4、批量获取值
hmget key field [field ...]
# 5、删除指定key的字段,对应的value也就没有了
hdel key field [field ...]
# 6、获取所有长度
hlen key
# 7、判断key中的字段是否存在 
hexists key field
# 8、获取key中所有字段
hexists key field
# 9、获取key中所有value
hvals key
# 10、自增
hincrby key field increment
# 11、不存在创建,存在创建不成功
hsetnx key field value

5、ZSet

有序集合,在set的基础上增加了一个score的值,可以通过score进行排序。
使用场景:set使用的都可以使用,与其同时可以增加权重进行排序。例如微博等排行榜应用的实现。

# 1、添加一个或者多个值
zadd key score value score2 value2
# 2、根据score排序 -inf +inf 无穷小到无穷大 是否显示score值 默认从小到大排序
zrangebyscore key min max [withscores]
# 3、删除有序集合中指定元素
zrem key member [member ...]
# 4、获取有序集合中的个数
zcard key
# 5、默认从大到小排序
ZREVRANGE key start stop [WITHSCORES]
# 6、获取指定区间的成员数量
zcount key min max

6、Geospatial地理位置

使用场景:附近的人、打车距离的计算、朋友定位。可以推算出地理位置信息,两地之间的距离,方圆几里内的人。Geo底层原理就是zset,可以使用zset相关命令查看,例如官网并没有给定Geo删除的命令,但是可以使用zset中的删除语法zrem。

  • geoadd:添加地理位置的坐标。
  • geopos:获取地理位置的坐标。
  • geodist:计算两个位置之间直线距离。
  • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
  • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
  • geohash:返回一个或多个位置对象的 geohash 值。
# 1、用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。
GEOADD key longitude latitude member [longitude latitude member ...]

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEODIST Sicily Palermo Catania
"166274.1516"
redis> GEORADIUS Sicily 15 37 100 km
1) "Catania"
redis> GEORADIUS Sicily 15 37 200 km
1) "Palermo"
2) "Catania"
# 2、用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。
GEOPOS key member [member ...]
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEOPOS Sicily Palermo Catania NonExisting
1) 1) "13.36138933897018433"
   2) "38.11555639549629859"
2) 1) "15.08726745843887329"
   2) "37.50266842333162032"
3) (nil)
# 3、用于返回两个给定位置之间的距离
GEODIST key member1 member2 [m|km|ft|mi]
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEODIST Sicily Palermo Catania
"166274.1516"
redis> GEODIST Sicily Palermo Catania km
"166.2742"
redis> GEODIST Sicily Palermo Catania mi
"103.3182"
redis> GEODIST Sicily Foo Bar
(nil)
redis>

# 4、给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEORADIUS Sicily 15 37 200 km WITHDIST #显示到中心之间距离位置内的城市和km数
1) 1) "Palermo"
   2) "190.4424"
2) 1) "Catania"
   2) "56.4413"
redis> GEORADIUS Sicily 15 37 200 km WITHCOORD #显示其他人的经纬度
1) 1) "Palermo"
   2) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) 1) "15.08726745843887329"
      2) "37.50266842333162032"
redis> GEORADIUS Sicily 15 37 200 km WITHDIST WITHCOORD
1) 1) "Palermo"
   2) "190.4424"
   3) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) "56.4413"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"
redis>
# 5、用于获取一个或多个位置元素的 geohash 值
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEOHASH Sicily Palermo Catania
1) "sqc8b49rny0"
2) "sqdtr74hyu0"
redis>

7、Hypeloglog 基数

基数:不重复的元素,在数据量特别多的时候可以接受误差。
Hypeloglog基数统计的算法,占用的内存是固定的,2^64不同的元素基数,只需要废12kb内存,如果要从内存角度来比较的话,Hyperloglog是首选!
使用场景:用户数据的埋点!网站的UV,例如一个用户重复访问一个网站,但是还算作是一个人。传统方式:set保存用户的id,然后就可以统计set中的元素数量作为标准判断!这个方式如果保存大量用户id,比较麻烦且浪费空间,我们的目的是计数而不是保存用户id。
但是Hyperloglog有0.81%的错误率,统计UV任务,可以忽略不计!

# 1、添加元素 
pfadd key value1 value2 value3...
127.0.0.1:6379> pfadd mycount 123 1123 1231 12313
(integer) 1
# 2、查询key中数量 
pfcount key 
127.0.0.1:6379> pfcount mycount
# 3、合并 将key2和key3数据合并到key1中
pfmerge key1 key2 key3

8、Bitmaps 位存储

使用场景:统计用户信息,例如活跃与不活跃用户,打卡与未打卡
所有操作都是操作二进制位进行存储,消耗内存小,状态只有0和1
例如:365天 = 365bit 1字节=8bit 46个字节左右!

# 1、添加
setbit key offset value
# 一周内的打卡情况设计:
setbit sign 0 1
setbit sign 1 0
setbit sign 2 1
setbit sign 3 0
setbit sign 4 1
setbit sign 5 1
setbit sign 6 1
# 2、查看
getbit key offset
# 3、统计
bitcount key [start end]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值