redis学习笔记
传统数据库是ACID,A表示(原子性:Atomicity)、C表示(一致性:Consistency)、I表示(独立性:Isolation)、D表示(持久性:Durability)
redis CAP C:Consistency(强一致性) A:Availability(可用性) P:Partition tolerance(分区容错性)
CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。
而由于当前的网络硬件肯定会出现延迟丢包等问题,所以
分区容忍性是我们必须需要实现的。
所以我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。
=======================================================================================================================
C:强一致性 A:高可用性 P:分布式容忍性
CA 传统Oracle数据库
AP 大多数网站架构的选择
CP Redis、Mongodb
注意:分布式架构的时候必须做出取舍。
一致性和可用性之间取一个平衡。多余大多数web应用,其实并不需要强一致性。
因此牺牲C换取P,这是目前分布式数据库产品的方向
=======================================================================================================================
一致性与可用性的决择
对于web2.0网站来说,关系数据库的很多主要特性却往往无用武之地
数据库事务一致性需求
很多web实时系统并不要求严格的数据库事务,对读一致性的要求很低, 有些场合对写一致性要求并不高。允许实现最终一致性。
数据库的写实时性和读实时性需求
对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出来这条数据的,但是对于很多web应用来说,并不要求这么高的实时性,比方说发一条消息之 后,过几秒乃至十几秒之后,我的订阅者才看到这条动态是完全可以接受的。
对复杂的SQL查询,特别是多表关联查询的需求
任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的报表查询,特别是SNS类型的网站,
从需求以及产品设计角 度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。
BASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。
BASE其实是下面三个术语的缩写:
基本可用(Basically Available)
软状态(Soft state)
最终一致(Eventually consistent)
它的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。为什么这么说呢,
缘由就在于大型系统往往由于地域分布和极高性能的要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,我们必须采用另外一种方式来完成,这里BASE就是解决这个问题的办法
分布式系统
分布式系统(distributed system)
由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。分布式系统是建立在网络之上的软件系统。
正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。分布式系统可以应用在在不同的平台上如:Pc、工作站、局域网和广域网上等。
redis安装后在usr/local/bin下
修改redis.conf文件将里面的daemonize no 改成 yes,让服务在后台启动
启动redis服务端 redis-server [指定使用哪个配置文件的路径"/root/myredis/redis.conf"]
---redis-sentinel:redis集群使用
---redis-server:Redis服务器启动命令
启动redis客户端 redis-cli -p 6379 链接数据库
redis 默认一般有16个库,通过select [0] 来切换库 下标从0开始 查看总库数量dbsize
查看当前库所有的key :keys * 不推荐使用keys * 采用 keys k?来模糊查询
清除当前 flushdb 清理所有库 flushall(不适用)
判断某个key是否存在 exists key的名字
move key db --->当前库就没有了,被移除了
expire key 秒钟:为给定的key设置过期时间
ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
type key 查看你的key是什么类型
String 操作
set/get/del/append/strlen
Incr/decr/incrby/decrby,一定要是数字才能进行加减
getrange/setrange 类是java 截取,getrange k1 0 3 ,setrange k1 2 xxx(从下标2开始后面添加xxx)
setex(set with expire)键秒值/setnx(set if not exist)
实例:setex k1 10(内存中存活秒数) v1 , setnx k2 v2 (如果不存在这侧插入,返回:1、存在返回:0)
mset/mget/msetnx 、多值插入/多值获取/多值安全插入、
getset(先get再set),先获取值然后设置你输入的值
list 链表
查看所有链表keys * (模糊匹配list*)
lpush/rpush/lrange 、lpop/rpop
实例:



lindex,按照索引下标获得元素(从上到下)

llen :返回list长度
lrem key 删N个value

ltrim key 开始index 结束index,截取指定范围的值后再赋值给key

rpoplpush 源列表 目的列表 返回移动的那个值

lset key index value (替换某个list的某个坐标的值)

linsert key before/after 值1 值2 (在某个值得前面或者后面加上某个值)

redis 的list是一个字符串链表left,right都可以插入;
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了。
链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。
redis set学习记录
sadd/smembers/sismember
sadd 添加数据 sadd key values[多个空格隔开]
smembers 查看set集合的值 smembers key
sismember 查看某刻set集合的值是否存在

scard,获取集合里面的元素个数

srem key value 删除集合中元素

srandmember key 某个整数(随机出几个数)

spop key 随机出栈

smove key1 key2 在key1里某个值 作用是将key1里的某个值赋给key2

数学集合类 -差集:sdiff

数学集合类 -交集:sinter

数学集合类 -并集:sunion

redis hash学习
KV模式不变,但V是一个键值对


redis 之zset(sorted set)
zadd/zrange---withscores添加这个可看key:value



zrangebyscore key 开始score 结束score


limit 和mysql 分页差不多
zrem key 某score下对应的value值,作用是删除元素

zcard/zcount key score区间/zrank key values值,作用是获得下标值/zscore key 对应值,获得分数
zrevrank key values值,作用是逆序获得下标值

zrevrange 倒序查看
zrevrangebyscore key 结束score 开始score


浙公网安备 33010602011771号