Redis
Redis是什么
Redis (Remote Dictionary Server) 远程字典服务
是一个开源的使用ANSI C语言编写 key-Value 数据库 支持网络, 提供多种语言的api
-
内存存储, 持久化, 内存中是断电即失,所以说持久化很重要 (rdb,aof)
-
效率高,可以用于高速缓存
-
发布订阅系统
-
地图信息分析
特性
-
多样化数据类型
-
持久化
-
中文网 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
-
ps -ef|grep redis 查看 redis服务
-
如何关闭redis服务 () 在 cli端发送命令shutdown
-
在次查看redis服务 ps -ef|grep redis
-
性能测试
-
redis-benchmark 是一个压力测试工具 (官方自带)
-
使用 redis-benchmark 命令参数
-
-h 指定服务器主机名 默认值127.0.0.1
-
-p 指定服务器端口号 默认值 6379
-
-s 指定服务器socket
-
-c 指定并发连接数 默认值 50
-
-n 指定请求数 默认值 10000
-
-d 以字节的形式指定set/get 值的数据大小 默认值 2
-
-k 1=keep alive 0=reconnect 默认值 1
-
-r wet/getincr 作用随机 key,sadd 使用随机值
-
-P 通过管道传输 <numreq>请求 默认值 1
-
-q 强制退出redis 仅显示query/sec值
-
-csv 以csv格式输出
-
-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: 高性能的服务器一定是多线程的
-
误区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中
-
数据集合类
-
差集 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
-
有效的绝对计划从-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
-
获取指定的经度和维度
-
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)
-
pfadd 加数据
-
pfcount 计算个数
-
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
-
-
bitcount sign 统计这周的打卡计录
-

浙公网安备 33010602011771号