redis使用总结

启动命令:
redis-server  redis.conf
停止Redis命令
redis-cli shutdown

进入redis客户端命令:
./redis-cli -h redis服务器IP -p 6379 -a 密码

 

查看所有的key:
KEYS *

 


redis客户端 查看数据:

 1、 set 集合  key:set
 

SCARD key #获取集合中元素数量

SMEMBERS key #返回集合中所有的元素

2、hash :  key hkey value
根据key和hkey查数据: HGET key hkey
 

查看key下所有值:HGETALL key
 

HKEYS key  获取所有字段:
 

HLEN key   获取key下 字段的个数:
 

判断 key和field 是否存在: 1是存在 0是不存在
HEXISTS key  hkey

3、string    : key value

SET key value

get key

 

4、list   : key list

向list里存数据:LPUSHX key value

从左边 取数据:LRANGE key start stop

取最新10条:

LRANGE key -9 -1

根据index取值
LINDEX key 1

查询长度:
LLEN key

从左侧推4条数据:根据下标,0 开始取 可以取出最新的数据。
LPUSH listtest 1 2 3 4

LRANGE listtest 0 3
xxx:6379> LRANGE listtest 0 3
1) "4"
2) "3"
3) "2"
4) "1"


从右侧推4条数据:根据下标0 开始取 可以取出最老的数据。
RPUSH listtest1 1 2 3 4

xxx:6379> LRANGE listtest1 0 3
1) "1"
2) "2"
3) "3"
4) "4"

不管是左边压入还是右边压入,LRANGE listtest1 -9 -1都是取最新的10条
LRANGE listtest1 -9 -1

xxx::6379> LRANGE listtest1 -9 -1
1) "4"
2) "5"
3) "6"
4) "7"
5) "8"
6) "9"
7) "10"
8) "11"
9) "12"
xxx::6379> LRANGE listtest -9 -1
1) "4"
2) "3"
3) "2"
4) "1"

 


redis部署模式:
redis可以单机、多实例和集群部署。
单机支持万次/s 的请求, 主从集群支持10+万/s 的请求,

单机上启动多个实例:适用于同一台机器上有多个应用,他们的redis数据不共享,可以启动多个实例分别存储多个应用的数据。

集群部署分为:主从结构(读写分离支持高并发,主从节点存相同的数据)、哨兵模式(高并发高可用,主从节点存相同的数据)、集群模式(高并发高可用、各个节点互通,不同节点存储不同的数据,客户端连接一个节点就可以访问到所有节点的数据,大数据量也可以支撑)

redis连接数总结:
redis库中连接数是由redis连接池配置和管理的,有最小连接数,最大活跃连接数和空闲连接数。不同的key值下的操作是相互独立的。

redis的操作线程是单线程在运行,严格来说,Redis Server是多线程的,只是它的请求处理整个流程是单线程处理的。

(如果只有一个应用的一个线程一直操作reds 的一个key不会有并发的问题,但是有多个应用同时操作redis的key,就会有并发安全的问题,如两个客户端同时给一个key下的值从0 循环加1 加1000次,两个应用同时跑的话,最后的结果是个小于2000的数)


单线程处理最大的缺点就是,如果前一个请求发生耗时比较久的操作,那么整个Redis就会阻塞住,其他请求也无法进来,直到这个耗时久的操作处理完成并返回,其他请求才能被处理到。


我们平时遇到Redis变慢或长时间阻塞的问题,90%也都是因为Redis处理请求是单线程这个原因导致的。


所以,我们在使用Redis时,一定要避免非常耗时的操作,例如使用时间复杂度过高的方式获取数据、一次性获取过多的数据、大量key集中过期导致Redis淘汰key压力变大等等,这些场景都会阻塞住整个处理线程,直到它们处理完成,势必会影响业务的访问。


每执行一个redis操作,都会opening RedisConnection 然后又Closing Redis Connection ,这是不是说每次执行redis操作都需要创建一个连接,操作完然后又关闭连接呢?实际上不是这样的,阅读源代码我们可以发现我们对redis的所有操作都是通过回调execute函数执行的,


这里面每次执行action.doInRedis(connToExpose)前都要调用RedisConnectionUtils.getConnection(factory);获得一个连接,进入RedisConnnectionUtils类中,getConnection(factory)最终调用的是doGetConnection(factory, true, false, enableTranactionSupport)这个函数。这个函数我们可以看下api文档,发现实际上并不是真的创建一个新的redis连接,它只是在connectFactory中获取一个连接,也就是从连接池中取出一个连接。当然如果connectFactory没有连接可用,此时如果allowCreate=true便会创建出一个新的连接,并且加入到connectFactory中。
基本上可以确定真实的情况是spring-data-redis已经帮我们封装了连接池管理,我们只需要调用一系列操作函数即可,这给操作redis带来了极大的方便。

posted on 2020-10-15 15:26  luckyna  阅读(491)  评论(0编辑  收藏  举报

导航