Redis

Redis是什么

Redis (Remote Dictionary Server) 远程字典服务

是一个开源的使用ANSI C语言编写 key-Value 数据库 支持网络, 提供多种语言的api

 

  1. 内存存储, 持久化, 内存中是断电即失,所以说持久化很重要 (rdb,aof)

  1. 效率高,可以用于高速缓存

  1. 发布订阅系统

  1. 地图信息分析

特性

  1. 多样化数据类型

  1. 持久化

  2. 官网 https://redis.io

  3. 中文网 http://redis.cn ( wdinow 在Github上下载 (停更很久了))

Windows 安装

  • 下载安装包: https:// github.com/dmajkic/redis/releases

  • 解压可用

  • 开起redis

Linux 安装

  • 下载安装包 redis-5.0.8.tar.gz

  • mv redis.tar.gz /opt ; cd opt; tar -zxvf redis.tar.gz

  • 进入解压后的文件, 可以看到redis.conf

  • yum install gcc-c++

  • make

  • redis 默认安装路径 usr/ 下面 cd usr/local/bin

  •  

     

  • cp /opt/redis/redis.conf . 保证原生redis.conf 的不变 以后就用这个配制

  • 把配制文件的 daemonize no 改为 daemonize yes 以后台方式启动

  • 启动redis服务 redis-server redis.conf 通过指定的配制文件启动服务

  • 测试连接 redis-cli -p 6379

    1. ps -ef|grep redis 查看 redis服务

    2. 如何关闭redis服务 () 在 cli端发送命令shutdown

    3. 在次查看redis服务 ps -ef|grep redis

性能测试

  • redis-benchmark 是一个压力测试工具 (官方自带)

  • 使用 redis-benchmark 命令参数

    1. -h 指定服务器主机名 默认值127.0.0.1

    2. -p 指定服务器端口号 默认值 6379

    3. -s 指定服务器socket

    4. -c 指定并发连接数 默认值 50

    5. -n 指定请求数 默认值 10000

    6. -d 以字节的形式指定set/get 值的数据大小 默认值 2

    7. -k 1=keep alive 0=reconnect 默认值 1

    8. -r wet/getincr 作用随机 key,sadd 使用随机值

    9. -P 通过管道传输 <numreq>请求 默认值 1

    10. -q 强制退出redis 仅显示query/sec值

    11. -csv 以csv格式输出

    12. -t 仅运行以逗号分隔的测试命令列表

 

 

基础知识

  • redis默认有16个数据库 可以使用select进行切换数据库 select 7

  • dbsize 查看数据库大小 查看 所有的key keys *

  • flushdb 清空当前数据库 flushall 清除所有数据

Redis 是单线程的

官方表示,Redis 是基于内存操作,cpu 不是redis性能瓶颈 Redis 瓶颈是根据机器内存和网络带宽

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

Redis 为什么这么快

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

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

    核心: redis是将所有的数据全部放在内存中的,所有说使用单线程去操作效率高, 多次读写都是在

    一个CPU上的

Redis key

  • exists key 看一个key是否存在

  • move key 1 移除当前的key

  • set name qin

  • expire name 10 对name 设过期时间

  • tt1 name 查看当前 key的剩余时间

  • type key 查看 当前 key 的类型

  • append key "hello" 对字符串增加数据

  • set key 0 incr key decr key incrby key 10 decrby key 10 数据自增自减

  • set key1 "dada" GETRANGE Key1 0 3 dad

  • setex ( set with expire ) # 设置过期时间

  • setnx (set if not exist) # 不存在设置 (在分布式锁中会常常使用)

  • mset k1 v1 k2 v2

  • mget k1 k2

  • msetnx k1 v1 k2 v2 有就不设置了

  • mset user:1:name k1 user :1:age:18 mget user:1:name user:1:age

  • getset 先获取在设置

LIST

  • lpush list one

  • lpush list two

  • lrange list 0 -1

  • rpush list one

  • rpush list two

  • lrange list 0 -1

  • lpop list

  • rpop list

  • lindex list 2

  • llen list

  • 移除指定的值 lrem key list 1 one

  • 如 list = [1,2,3,4,5] ltrim list 0 2 这样 list = [1, 2, 3]

  • rpoplpush 移除列表最后一个元素添加到另一个列表中

  • lpoprpush

  • lset list 0 item 改变元素的值

  • linsert list after world newstring

  • linsert list before world other

Set 无序不重复的值

  • sadd myset hello

  • sismember myset hello 查看值是否存在

  • smembers myset 查看 myset里面的所有值

  • scard myset 获取set 集合中的内容元素

  • srem myset hello 移除 hello元素

  • srandmember 随机抽选出一个元素

  • spop myset 移除指定的KEY

  • 将一个指定的值移动到另外一个key 中 sadd myset 'hello' sadd myset2 'hello3'

    smove myset myset2 hello 把集合myset中的hello移动到myset2中

    1. 数据集合类

      • 差集 sdiff myset myset2 查看 二个集合中的不同

      • 交集 sinter myset myset2 查看 二个集合中的相同

      • 并集 sunion myset myset2 查看 二个集合中的合集

Hash

  • key-map集合

  • hset myhash key value1

  • hget myhash key

  • hmset myhash key2 value2 key3 value3

  • hmget myhash key2 key3 value3

  • hdel myhash key2 删除指定的key

  • hgetall myhash

  • hexists myhash key1 判断一个key 是否存在

  • 只获得key hkeys myhash

  • 只获得值 hvals myhash

  • hset myhash field 5 hincrby myhash field 1 自增

  • hsetnx myhash field1 world 不存在则设置值

set

  • zadd salary 2500 xiaohong

  • zadd salary 300 xiaoming

  • zadd salary 900 xiaoxing

  • zrangbyscore salary -inf +inf 排序 -inf 负无穷  +inf 正无穷

  • zrangbyscore salary -inf +inf withscores

  • zrevrange salary 0 -1 从大到小

 

  

Redis 的Geo在Redis3.2 就推出了! 这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人 只有6个命令

  • GEOADD

  • GEODIST

  • GEOHASH

  • GEOPOS

  • GEORADIUS

  • GEORADIUSBYMEMBER

    • https://www.redis.net.cn/order/3685.html

    • 有效的绝对计划从-180 到180 有效的纬度从 -85.05112878度到85.05112878

    • geoadd china:city 116.40 39.90 beijin 经度 维度

    • geoadd china:city 121.47 31.23 shanghai

    • geoadd china:city 106.50 29.53 chongqi 114.05 22.52 shengzh 120.16 hangzhou

    1. 获取指定的经度和维度

    • geodist

      • geodist china:city beijing shanghai 返回北京到上海的距离

      • geodist china:city beijing chongqi 北京到重庆的直线距离

    • georadius 我附近的人 (获得所有附近的人的地址,定位) 通过半径来查询

      • georadius china:city 110 30 1000 km 110 30 当前定位 半径为1000 KM withdist

      • georadius china:city 110 30 1000 km 110 30 当前定位 半径为1000 KM withcoord 显示他人的定位信息

      • georadius china:city 110 30 1000 km 110 30 当前定位 半径为1000 KM withcoord withdist count 2 查询110 30经纬度 为中心 查询 中心距离的位置 count 选出指定的结果

    • GEORADIUSBYMEMBER

      • 找出位于指定元素周围的其他元素

      • georadiusbymember china:city beijing 1000 km

    • geohash china:city chongqi beijing

      • 将二维的经纬度转为一维的字符串

    geo 底程使用的是zset

    • zrange china:city 0 -1

    • zrem china:city beijing 删除一个元素

Hyperloglog

什么是基数

A (1, 3, 4, 5,7, 7)

B (1, 2, 5, 7, 8)

基数(不重复的元素) = 5, 可以接受误差

优点: 占用的内存是固定的,2^64不周的元素的技术,只需要 12KB内存 0.81 % 错误率

网页的UV (一个人访问一个网站多次,但是还是算作一个人 !)

传统的方式 set 保存用户的id,然后就可以统计set 中元素数量作为标准判断

这个方式如果保存大量的用户id,就会比较麻烦 目的是为了计数

  •  

  • 三个方法 (如果允许容错,那么一定可以使用Hyperloglog)
    1. pfadd 加数据

    2. pfcount 计算个数

    3. pemerge 合并

    • pfadd mykey a b c d e f g h i j k l m n o p q

    • pfadd mykey2 a b c d e f g h i

    • pfcount mykey

    • pemerge mykey3 mykey mykey2 把mykey1 mykey2 的数据合并到mykey3

 

Bitmaps

位存储

三个方法

 setbit

getbit

bitcount

统计用户信息, 活跃, 不活跃! 打卡

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

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

  • 如周一到周日的打卡

    周一: 1 周二:0 周3:1

    • setbit sign 0 1 周一打卡 设为1

    • setbit sign 1 0 周二没打卡设为0

    • setbit sign 2 1 周三打卡设为1

    • getbit sign 3 获取周三是否打卡

    • bitcount sign 统计这周的打卡计录