Redis是什么

Redis是目前最受欢迎的NoSQL(非关系数据库)数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库。一般用来做缓存来减少对Mysql的压力。

Redis连接

步骤

1.进入usr/local/bin

2.启动config文件夹里的redis.conf : redis-server config/redis.conf

3.输入 redis-cli -p 6379

查看进程(也就是看它开启没)

ps -ef|grep redis

退出redis

退出redis: shutdown

然后出现not connected,是未连接状态

此时输入: exit

彻底退出进行到我们的服务器指令这来

redis数据库命令

select 1 #切换到第一个数据库,默认0
DBSIZE #查看现在的数据库内有多少数据(DB)
FLUSHALL #清空全部数据库数据
flushdb #清空当前数据库数据



redis-benchmark 的性能测试

其中p是redis的端口号,c代表发送的次数,n代表总次数

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

redis认知

redis中默认有16个数据库,

redis可以用来作为数据库、缓存、消息中间件MQ

他是一个单线程!原因是他存储在内存,不用cpu的多线程的原因是以为多线程的话会上下文切换,还不如直接用单线程,

常见的数据类型

  1. list 列表
  2. String 字符串
  3. set 集合
  4. zset 有序集合
  5. hash 哈希

String(字符串)

keys * #查看所以的键
mset k1 v1 k2 v2 k3 v3 #批量创建,k1值为v1,k2值为v2....
msetnx k1 v1 k2 v2  #是一个原子性操作,要么一起成功要么一起失败
type name #查看name的类型
EXISTS #判断一个字段是否存在
move name  #移除一个键
EXPIRE name 10 #设置键的过期时间 
ttl name #查看name过期时间还剩多少
setex name 30 "hello" #创建一个30秒的name
APPEND name "ni" #在name值后面追加ni
incr age  #让age数字加一,打比方类似于视频播放量什么的播放一次加一
decr age  #让age数字减一
INCRBY age 10 #设置步长,指定该增量
GETRANGE name 0 2  #就是显示name值的第0个下标到第二个下标的值,如果2的值成负数显示的数值是全部
SETRANGE name 1 vv #就是修改name值的第1个下标后面的值,比如xiao,变成Xvvo
setnx name "xiao" #如果name不存在就创建一个name,反正创建失败,就不会导致像set一样直接替换了

#对象1 
set user:1 {name:zhangsan,age:3} #设置一个user:1 对象 值为json字符来保存一个对象
get user:1
#对象2
mset user:2:name xiaoming user:2:age 123
mget user:2:name user:2:age

#getset的用法流程在下
127.0.0.1:6379> getset db redis# 如果不存在值,则返回 ni7
(ni1)
127.0.0.1:6379> get db"redis
127.0.0.1:6379> getset db mongodb # 如果存在值,获取原来的值,并设置新的值"redis"
127.0.0.1:6379> get db"mongodb"

List(列表)

list值可重复

lpush list one  #没有list创建一个list给它存一个 one,有就直接存,但是顺序是越晚存的下标越小
rpush list a    #这个的话直接存到最大下标的前面,与lpush相反
lrange list 0 -1 #输出list下标0到下标1里的值
lpop list #移除数组左边第一个值,也就是下标最小的那个值
rpop list #移除数组右边第一个值,也就是下标最大的那个值
lindex list 1 #显示list下标1的值
llen list  #显示list一共有多少值
lrem list 1 a #移除list里面1个a,1可以不写都可以,也可以移除2个a,
ltrim list  1 2 #通过下标来截取出之间的值,list只保存截取出来的值
rpoplpush list alist #把list最后的值剪切到alist里中
lset list 0 aa #把下标0替换成aa,必须要有这个下标!

#LINSERT mylist before:before是后面的意思这个可以改成前面,所以意思是在list集合里面的world值后面添加一个other值,(默认顺序是越晚早的下标越大)
Rpush list "hello"
    (integer)1
Rpush list "world"
    (integer)2
LINSERT list before "world" "other"
    (integer)3
LRANGE list 0 -1
    1) "hello"
    2) "other"
    3) "world"




set(集合)

无序不可重复

sadd myset aa #创建一个set或者新增一个值
smembers myset #显示myset里所有的值
sismember myset aa #查看myset里是否有没有aa
scard myset #显示myset一共有多少个
srem myset aa #移除mysetr的aa
smove myset myset2 xiaobai #把myset的xiaobai移动到muset里



sadd key1 a
sadd key1 b
sadd key1 c
sadd key2 c
sadd key2 d
sadd key2 3
#差集
SDIFF key1 key2  #每个set第一个不同的值
    “b”
    “a”
#交集
sinter  key1 key2   #他们两相同的值
    "c"
#并集
sunion key1 key2  #这两个set的所以值显示出来,重复的显示一个
    “b”
    “c”
    “e”
    “a”
    “d”

Hash(哈希)

map集合,key-value

hset myhash k1 kuan #在myhash里的k1里新增一个kuan
hget myhash k1 #显示myhash里的k1所有的值
hmset myhash k1 aa k2 bb #创建多个key-value
hmget myhash k1 k2  #查看多个key-value
hgetall myhash #查看所以key与value
hdel myhash ke #删除key
hlen myhash #查看多少有个key
Hexists myhash k1#看这个看是否存在
hkeys myhash #查看所以的key
hvals myhash #查看所以的value


 


zset(有序集合)

在set的基础上增加了一个值,用到的地方比如排行榜

set k1 v1 k1 v2, zset k1 score1 v1

zadd myset 1  one 2 two #1是顺序可以按照自己的来,one是值 ,可以创建多个也可以单个
zrange myset 0 -1 #查看全部值

#实验  2500列钱 a列是名字
#从小到大排序
zadd salary  2500 a
zadd salary  5000 b
zadd salary  500 c
ZRANGEBYSCORE salary -inf +inf      #inf是无穷的意思,这段意思是 负无穷到正无穷钱排序
    "c"
    "a"
    "b"
ZRANGEBYSCORE salary -inf +inf WITHSCORES  #加了一个WITHSCORES显示钱,
    "c"
    "500"
    "a"
    "2500"
    "b"
    "5000"
    ZRANGEBYSCORE salary -inf 2500  WITHSCORES  #显示2500以及一下的值
    "c"
    "500"
    "a"
    "2500"
    
    zrem myzset a#移除myset的a

三种特殊数据类型

geospatial

geospatial 地理位置简介

Redis的Geo在redis3.2版本就推出,这个功能可以推算出地理位置的信息,也就是两地直接的距离,方圆几里的人!

它只有六个命令

城市经纬度查询-国内城市经度纬度在线查询工具 (jsons.cn)

geoadd

#测试geoadd
#参数 key 值(维度,经度) 名字
#经度范围 -180 ~ 180 维度 -85.05112878 ~ 85.05112878 

geoadd china:city 116.40 39.90  beijin #第一个数字是维度,第二个是经度
geoadd china:city 121.47 31.23  shanghai



geopos

#获得一个或者两个的详细的经度纬度
geopos china:city beijin shanghai 
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "121.47000163793563843"
   2) "31.22999903975783553

geodist

#显示beijin与shanghai的距离默认英寸,我这km设置了千米
geodist china:city  beijin shanghai km
    1067.3788"




georadius

#查找china里面的ciity所有在指定的经度纬度 范围的城市
#经度 纬度 查找半径的大小 单位 
georadius china:city 110 30 1000 km  withcoord  #withcoord 显示到中间距离的位置




GEORADIUSBYMEMBER

#找出指定城市位置边上的城市,前也必须要在China:city里
GEORADIUSBYMEMBER china:city beijin 1000 km

zrem

#移除地区
 zrem china:city shangha




Hyperloglog

基数

打比方:A{1,3,5,7,9,7} B{1,3,5,7,9}

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

也就是有两组元素再怎么有重复滴值,最终用这个的话直接给你统一了然后合并

简介

Redis 2.8.9版本就更新了Hyperloglog数据结构! Redis Hyperloglog基数统计的算法!

优点:占用的内存是固定,264不同的元素的技术,只需要废12KB内存!如果要从内存角度来比较的话Hyperloglog首选!

Hyperloglog是一个数据结构 操作二进制位来进行记录的,

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

传统的方式,set 保存用户的id,然后就可以统计set 中的元素数量作为标准判断! 这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id ; 0.81%错误率!统计UV任务,可以忽略不计的!

Bitmaps

存储

类似于用于统计用户信息:活跃不活跃!登录未登录!打卡:打卡、未打卡,都用Bitmaps

是一个数据结构 操作二进制位来进行记录的,

1字节=46个字节左右

                                                                                                                         后续扩展中........