Redis(1)

1.Redis概述

Redis的定义

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

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

Redis的优势

1.性能极高---Redis能支持超过10W次每秒的读写频率。

2.丰富的数据类型---Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets数据类型操作。

3.原子---Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行(简单的事务)。

4.丰富的特性 – Redis还支持 publish/subscribe(发布/订阅), 通知, key过期等等特性

使用Redis的公司github,blizzard,stackoverflow,flickr,国内有新浪微博【拥有全球最大的Redis集群】,淘宝,腾讯微博。

注意:Window在GitHub上下载(停更很久了)!

Redis推荐都是在Linux服务器上搭建,下面学习基于Linux

2.安装Redis

       安装教程见

Redis下载和安装_Java-请多指教的博客-CSDN博客

3.redis-benchmark性能测试

redis-benchmark是官方自带的性能测试工具。用来模拟 N 个客户端同时发出 M 个请求

redis-benchmark性能测试命令:

使用 redis-benchmark -h 命令来查看使用参数

redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>]

 -h <hostname>                    指定服务器主机名 (默认 127.0.0.1)

 -p <port>                          指定服务器端口 (默认 6379)

 -s <socket>                        指定服务器 socket

 -a <password> Redis          认证密码

 -c <clients>                       指定并发连接数 (默认 50)

 -n <requests>                        指定请求数 (默认 100000)

 -d <size>                               以字节的形式指定 SET/GET 值的数据大小 (默认 2)

 --dbnum <db>                      选择指定的数据库号 (默认 0)

 -k <boolean>                         1=keep alive 0=reconnect (默认 1)

 -r <keyspacelen>                    SET/GET/INCR 使用随机 key, SADD 使用随机值

 -P <numreq>                         通过管道传输 <numreq> 请求 (no pipeline)

 -q                                           退出,仅显示 query/sec 值

 --csv                                      以 CSV 格式输出

 -l                                            生成循环,永久执行测试

4.Redis基础命令

(1)redis默认有16个数据库,默认使用的是第0个数据库。可以使用select 数字 进行切换

(2)dbsize------当前数据库里键值对个数

(3)keys * ------当前数据库里所有键

(4)flushdb -----清空当前数据库

(5)flushall ------清空全部数据库

(6)exists 键名称 -------判断是否键存在

(7)move 键名称 数据库编号 -------从当前数据库把数据移动到指定数据库

(8)expire 键名称 秒数 ------这个键存在的时长

(9)set 键名称 键值------添加key-value

(10)type 键名称 ------查看键的类型

(11)ttl key-----查看剩余存在时长

还有很多命令,使用时查看官网

Redis命令中心(Redis commands) -- Redis中国用户组(CRUG)

5.Redis五大数据类型

5.1 String(字符串)类型

自增1 ----- incr key

自减1------decr key

可以设置步长,指定增量-------- incrby  key  步长

                                     --------decrby  key  步长

append key value ------追加字符串

截取字符串---------getrange key start end

替换指定位置开始的字符串-------- setrange key offset value

设置过期时间(会覆盖同名的key)-----------setex key seconds value

不存在这个键再设置键值(如果存在,则创建失败)--------------- setnx key value

      

批量设置键值对-------- mset k1 v1 k2 v2 k3 v3…… 

-------msetnx k1 v1 k2 v2 k3 v3……  (原子性,要么一起成功,要么一起失败)

批量获取键的值--------mget k1 k2 k3……

设置对象----使用json

set user:1 {name:zhangsan,age:23,address:xian}

高级的设置对象方式:

                     mset  user:{id}:{filed}  value          这里的key 为user:{id}:{filed}

getset key value------------先get再set

                     如果先get没有这个key,则返回nil,但是会设置这个key和value

                     如果先get有这个key,则返回原来的值,但是会设置新的值

总结:

String类型

命令

描述

incr   key

自增1

decr  key

自减1

incrby/decrby  key  步长

设置步长,指定增/减量

append key value

追加字符串

getrange key start end

截取字符串

setrange key offset value

替换指定位置开始的字符串

setex key seconds value

设置过期时间(会覆盖同名的key)

setnx key value

不存在这个键再设置键值(如果存在,则创建失败)

mset k1 v1 k2 v2 k3 v3……

批量设置键值对(原子性,要么一起成功,要么一起失败)

mget k1 k2 k3…

批量获取键的值

getset key value

如果先get没有这个key,则返回nil,但是会设置这个key和value;如果先get有这个key,则返回原来的值,但是会设置新的值

5.2List列表类型

redis的LIST结构(想象成java中的List),是一个双向链表结构,可以用来存储一组数据。值可以重复。

所有的List命令都是以l开头的

lpush key element [element ...]-----------list中添加元素【从左向右添加,最后一个排在开头

lrange key start stop------获取列表中的一部分数据,两个参数,第一个参数代表第一个获取元素的位置(0)开始,第二个值代表截止的元素位置,如果第二个参数为-1,截止到列表尾部;

rpush key element [element ...]------- list中添加元素 [从右向左添加,最后一个排在末尾]

lpop key-------移除list中第一个元素,并返回这个元素

rpop key-------移除list中最后一个元素,并返回这个元素

lindex key index--------通过下标获取list中的某一个值

llen key------返回列表的长度(就是有list中有几个元素)

127.0.0.1:6379> llen nase

(integer) 2

lrem key count element-------移除list集合中指定个数的value,精确匹配

lset key index element----------更新当前下标的值

       该下标如果存在,更新当前小标的值,如果不存在,则报错

linsert key BEFORE|AFTER pivot element--------将某个具体的value插入到某个元素的前面或者后面

总结

List类型

命令

描述

lpush key element [element ...]

list中添加元素【从左向右添加,最后一个排在开头】

rpush key element [element ...]

list中添加元素 [从右向左添加,最后一个排在末尾]

lrange key start stop

获取列表中的一部分数据,两个参数,第一个参数代表第一个获取元素的位置(0)开始,第二个值代表截止的元素位置,如果第二个参数为-1,截止到列表尾部

lpop key

移除list中第一个元素,并返回这个元素

rpop key

移除list中最后一个元素,并返回这个元素

lindex key index

通过下标获取list中的某一个值

llen key

返回列表的长度

lrem key count element

移除list集合中指定个数的value,精确匹配

lset key index element-

更新当前下标的值,该下标如果存在,更新当前小标的值,如果不存在,则报错

linsert key BEFORE|AFTER elemet1 element2

将某个具体的value插入到element1的前面或者后面

5.3 set集合类型

       set集合命令都是以s开头。set无序不重复集合

sadd key member [member ...]-------------往set中添加元素

smembers key---------查看指定set所有值

sismember key member----------判断某一个值是不是在set集合中(存在返回1  不存在返回0)

scard key--------获取set集合中的内容元素个数

srem key member [member ...]----------移除set集合中指定的元素

srandmember key [count]-------随机抽选x个元素,count为x个数

spop key [count]----------随机删除一些set集合中的元素

smove source destination member-----------将一个指定的值,移动到另外一个set集合

求两个set集合的交集

        sinter key key......

总结

Set类型

命令

描述

sadd key member [member ...]

往set中添加元素

smembers key

查看指定set所有值

sismember key member

判断某一个值是不是在set集合中(存在返回1  不存在返回0)

scard key

获取set集合中的内容元素个数

srem key member [member ...]

移除set集合中指定的元素

srandmember key [count]

随机抽选x个元素,count为x个数

spop key [count]

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

smove source destination member

将一个指定的值,移动到另外一个set集合

5.4 Hash类型

       Map集合,key-value(Map集合)。命令和String类型区别不大。

       命令h开头

hset key field value [field value ...]-----------设置一个具体的 key-value

hmset key field value [field value ...]----------批量设置

hmget key field [field ...]---------批量得到key-value

hget key field------------得到指定map集合中指定键的值

hgetall key-------------得到所有map集合的key-value,返回的是一个键一个值

hdel key field [field ...]---------------删除指定的map集合里面的key ,对应的value也会被删掉

hlen key----------获取map集合中key-value键值对数量

hexists key field----------判断map中指定key是存在

hkeys key---------只获取map中所有的key

hvals key---------只获取map中所有的value

hincrby key field increment ----------指定增量,返回结果值

hsetnx key field value-----------如果存在则不能设置,不存在则可以设置

总结

Hash类型

命令

描述

hset key field value [field value ...]

设置一个具体的 key-value

hmset key field value [field value ...]

批量设置

hmget key field [field ...]

批量得到key-value

hget key field

得到指定map集合中指定键的值

hgetall key

得到所有map集合的key-value,返回的是一个键一个值

hdel key field [field ...]

删除指定的map集合里面的key ,对应的value也会被删掉

hlen key

获取map集合中key-value键值对数量

hexists key field

判断map中指定key是存在

hkeys key

只获取map中所有的key

hvals key

只获取map中所有的value

hincrby key field increment

指定增量,返回结果值

hsetnx key field value

如果存在则不能设置,不存在则可以设置

5.5 Sorted Sets(有序集合)

       在set的基础上,增加了一个值,set k1 v1 ----------> zset k1 score1 v1

zadd key [NX|XX] [CH] [INCR] score member [score member …]------添加元素,score表示位置

zrange key start stop [WITHSCORES]-------------查看set元素,如果添加时有空位置自动补齐

zrangebyscore key min max---------根据score排序,从小到大排序

zrangebyscore key min max withscores --------根据score排序,并且显示score和value 

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

zrem key member [member ...]----------------移除有序集合中的元素

zcard key--------------获取有序集合中的个数

zrevrange key start stop [withscores]----------从大到小排序

zcount key min max-------------获取指定区间的元素数量

总结

zset类型

命令

描述

zadd key score member [score member …] 

添加元素,score表示位置

zrange key start stop [WITHSCORES]

查看set元素,如果添加时有空位置自动补齐

zrangebyscore key min max

根据score排序,从小到大排序

zrangebyscore key min max withscores

根据score排序,并且显示score和value 

zrangebyscore salary -inf 2000 withscores

显示工资小于2000的员工升序排序

zrem key member [member ...]

移除有序集合中的元素

zcard key

获取有序集合中的个数

zrevrange key start stop [withscores]

从大到小排序

zcount key min max

获取指定区间的元素数量

zscore key member查询集合中member元素是否存在,存在则返回元素所在位置,不存在则返回nil

6.三种特殊数据类型

6.1 geospatial地理位置

    将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。

该命令以采用标准格式的参数x,y,所以经度必须在纬度之前。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引。具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001 规定如下:

  • 有效的经度从-180度到180度。
  • 有效的纬度从-85.05112878度到85.05112878度。

当坐标位置超出上述指定范围时,该命令将会返回一个错误。

相关命令:GEOADD   GEODIST    GEOHASH        GEOPOS      GEORADIUS      GEORADIUSBYMEMBER

(1)geoadd key longitude latitude member [longitude latitude --------将指定的地理空间位置(纬度、经度、名称)添加到指定的key中

(2) geodist key member1 member2 [m|km|ft|mi]----------返回两个给定位置之间的距离。

127.0.0.1:6379> geodist china:city beijing shanghai

"1067378.7564"

(3) geohash key member [member ...]------------返回一个或多个位置元素的 Geohash 表示。11个字符的Geohash字符串。

127.0.0.1:6379> geohash china:city beijing shanghai

1) "wx4fbxxfke0"

2) "wtw3sj5zbj0"

(4) geopos key member [member ...]----------从key里返回所有给定位置元素的位置(经度和纬度)。

127.0.0.1:6379> geopos china:city beijing

1) 1) "116.39999896287918091"

   2) "39.90000009167092543"

(5) georadius key longitude latitude radius m|km|ft|mi [WITHC--------------以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素

127.0.0.1:6379> georadius china:city 116 40 200 km  withcoord

1) 1) "beijing"

   2) 1) "116.39999896287918091"

      2) "39.90000009167092543"

(6)这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点

GEORADIUS命令redis6.0之后废弃使用,使用新的geosearch 

6.2 Hyperloglog基数统计

       比如一个人访问一个网站多次,但还是算作一个人,这样一般咱计算用户,传统方式肯定是使用set集合(重复的元素算一个)保存用户id,统计数量。但是占用的内存较大。

       HyperLogLog原理如同set集合,但是优势在占用的内存小,264不同的元素,只需要12KB内存。

只有三个命令

(1)PFADD key element [element ...] -------------将除了第一个参数以外的参数存储到以第一个参数为变量名的HyperLogLog结构中。成功返回1,失败返回0

(2)PFCOUNT key [key ...]--------------- 当参数为一个key时,返回存储在HyperLogLog结构体的该变量的近似基数,如果该变量不存在,则返回0。当参数为多个key时,返回这些HyperLogLog并集的近似基数,这个值是将所给定的所有key的HyperLoglog结构合并到一个临时的HyperLogLog结构中计算而得到的。

(3)PFMERGE destkey sourcekey [sourcekey ...]-------- 将多个 HyperLogLog 合并(merge)为一个 HyperLogLog , 合并后的 HyperLogLog 的基数接近于所有输入 HyperLogLog 的可见集合(observed set)的并集

6.3 Bitmaps 位图场景

       适用场景:比如记录打卡,一周学习情况(有学习,没学习) 很方便。只有0 和1 。

如setbit study 0 1 ----表示第一天已学习  setbit study 1 0----------表示第2天没学习

第一个参数为位置  第二个参数为状态0或1

(1) setbit  key offset value-----------设置值

(2) getbit  key offset----------------查看值

(3) bitcount  key --------------统计1的个数

例如使用bitmaps来记录周一到周日的打卡

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java-请多指教

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值