redis
NOSQL 介绍:
是一项全新的数据库革命性运动,是一个非关系型数据库,在超大规模和高并发的SNS类型网站中应用广泛。
NoSql是以key-value形式存储,特点是:非关系型、分布式、开源的水平可扩展。
特点优势:
- 处理超大量数据
- 运行在便宜pc集群上
- 击碎了性能瓶颈
应用场景:
1. 对数据高并发读写
2. 对海量数据的高效率存储和访问
3. 对数据的高可扩展性和高可用性
redis
Redis is an open source, BSD licensed, advanced key-value cache and store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets, sorted sets, bitmaps and hyperloglogs.
redis是一个开源的,先进的key-value缓存存储。它常作为缓存数据库,键可包含字符串、哈希、链表、集合(有序&无序)
支持 push/pop add/move 以及集合的操作,数据保存在内存中,会周期写入硬盘中。
redis数据类型:
string hash list set zset
string是最简单的类型,一个key对应一个value,string类型是二进制安全的。redis的string可以包括任何数据,比如jpg或者序列化的对象。
String类型:
1.设置key的value(set)
1 127.0.0.1:6379> set key pm 2 OK 3 127.0.0.1:6379> get key 4 "pm" 5 127.0.0.1:6379>
2.如果不存在设置(setnx)
1 127.0.0.1:6379> setnx key df 2 (integer) 0 3 127.0.0.1:6379> get key 4 "pm"
3.设置键的有效期(setex 10s有效期)
1 127.0.0.1:6379> setex key 10 value 2 OK 3 127.0.0.1:6379> get key 4 "value" 5 127.0.0.1:6379> get key 6 (nil) 7 127.0.0.1:6379>
4.设置替换(setrange)
1127.0.0.1:6379> set key pmx@gmail.com 2OK 3127.0.0.1:6379> get key 4"pmx@gmail.com" 5127.0.0.1:6379> setrange key 4 qq 6(integer) 13 7127.0.0.1:6379> get key 8"pmx@qqail.com" 9127.0.0.1:6379>
5.一次性设置多个key(mset)
1127.0.0.1:6379> mset key1 value1 key2 value2 key3 value3 2OK 3127.0.0.1:6379> get key1 4"value1" 5127.0.0.1:6379> get key2 6"value2" 7127.0.0.1:6379> get key3 8"value3" 9127.0.0.1:6379>
6.如果不存在设置(msetnx),如果有一个不成功(已存在),全部失效。
1127.0.0.1:6379> msetnx key4 value4 key5 value5 2(integer) 0 3127.0.0.1:6379>
7.获得旧值并设置新值
1127.0.0.1:6379> get key4 2"value4" 3127.0.0.1:6379> getset key4 kkkk 4"value4"
8.截取字符并返回(getrange)
1127.0.0.1:6379> get key 2"pmx@qqail.com" 3127.0.0.1:6379> 4127.0.0.1:6379> 5127.0.0.1:6379> getrange key 0 2 6"pmx" 7127.0.0.1:6379>
9.批量返回数据(mget)
127.0.0.1:6379> mget key1 key2 kye3
10.递增/递减(incr incrby/decr decrby)
1127.0.0.1:6379> incrby key 10 2(integer) 11 3127.0.0.1:6379> incrby key 10 4(integer) 21
11.追加value & 查看字符串长度
1127.0.0.1:6379> append key 10 2(integer) 4 3127.0.0.1:6379> get key 4"2110" 5127.0.0.1:6379> strlen key 6(integer) 4 7127.0.0.1:6379>
2.hashes类型:
hash一个string类型的field和value的映射表。它的添加、删除操作都是O(1),特别适合存储对象。
1.设置hash field(hset)
1127.0.0.1:6379> hset user:001 name pmx 2(integer) 1
2.如果不存在设置(hsetnx)与setnx类似
1127.0.0.1:6379> hsetnx user:001 name mm 2(integer) 0 3127.0.0.1:6379> hget user:001 name 4"pmx"
3.批量设置多个field、得到多个field(hmset,hmget)
1127.0.0.1:6379> hmset user:001 name mx age 17 2OK 3127.0.0.1:6379> hget user:001 name 4"mx" 5127.0.0.1:6379> hmget user:001 name age 61) "mx" 72) "17"
4.给指定hash field加上固定值(hincrby)
1127.0.0.1:6379> hincrby user:001 age 8 2(integer) 25
5.判断field是否存在(hexists)得到field个数(hlen)删除field
1127.0.0.1:6379> hexists user:001 age 2(integer) 1 3127.0.0.1:6379> hlen user:001 4(integer) 2 5127.0.0.1:6379> hdel user:001 age 6(integer) 1 7127.0.0.1:6379> hlen user:001 8(integer) 1
6.得到hash的所有 字段 & 值 &得到所有(hkeys & hvals & hgetall)
1127.0.0.1:6379> hmset user:002 key1 value1 key2 value2 key3 value3 2OK 3127.0.0.1:6379> hkeys user:002 41) "key1" 52) "key2" 63) "key3" 7127.0.0.1:6379> hvals user:002 81) "value1" 92) "value2" 103) "value3" 11127.0.0.1:6379> hgetall user:002 121) "key1" 132) "value1" 143) "key2" 154) "value2" 165) "key3" 176) "value3"
3.list类型
1.左压栈(lpush)右压栈(rpush) 左出栈(lpop)右出栈(rpop)(可以作队列用)插入(linsert)
1127.0.0.1:6379> lpush mystack world 2(integer) 1 3127.0.0.1:6379> lpush mystack hello 4(integer) 2 5127.0.0.1:6379> lpop mystack 6"hello" 7127.0.0.1:6379> lpop mystack 8"world" 9127.0.0.1:6379> lpush mystack hello 10(integer) 1 11127.0.0.1:6379> lpush mystack world 12(integer) 2 13127.0.0.1:6379> rpop mystack 14"hello" 15127.0.0.1:6379> rpop mystack 16"world" 17127.0.0.1:6379> lpush mystack kkkk 18(integer) 1 19127.0.0.1:6379> linsert mystack before kkkk jjjj 20(integer) 2 21127.0.0.1:6379> lrange mystack 0 -1 221) "jjjj" 232) "kkkk" 24127.0.0.1:6379>
2.设置list中指定下标的元素值(lset)(仿数组)删除(lrem)
注:lrem n value n<0时 从尾删除,n=0时全部删除
1127.0.0.1:6379> lrange mystack 0 -1 21) "jjjj" 32) "kkkk" 4127.0.0.1:6379> lset mystack 0 mmmm 5OK 6127.0.0.1:6379> lrange mystack 0 -1 71) "mmmm" 82) "kkkk" 9127.0.0.1:6379> lrange mystack 0 -1 101) "one" 112) "one" 123) "one" 134) "mmmm" 145) "kkkk" 15127.0.0.1:6379> lrem mystack 2 one 16(integer) 2
3.保留指定key的值范围内的数据(ltrim)
1127.0.0.1:6379> lrange mystack 0 -1 21) "jjjj" 32) "mmmm" 43) "kkkk" 5127.0.0.1:6379> ltrim mystack 1 -1 6OK 7127.0.0.1:6379> lrange mystack 0 -1 81) "mmmm" 92) "kkkk" 10127.0.0.1:6379>
4.从第一个list尾部移除元素并添加第二个list的头部(rpoplpush)
1127.0.0.1:6379> rpoplpush mystack mystack1 2"kkkk" 3127.0.0.1:6379> 4127.0.0.1:6379> 5127.0.0.1:6379> lrange mystack 0 -1 61) "mmmm" 7127.0.0.1:6379> lrange mystack1 0 -1
5.返回名称为key的list中index位置的元素(lindex)
1127.0.0.1:6379> lrange mystack 0 -1 21) "ssdsd" 32) "kkld" 43) "mmmm" 5127.0.0.1:6379> lindex mystack 2 6"mmmm"
6.返回key对应list的长度(llen)
1127.0.0.1:6379> llen mystack 2(integer) 3
4.sets类型
set是集合,string类型的无序集合, set是通过hash table实现的,添加、删除和查找的复杂度都是O(1)。对集合可以取并集、交集、查集。sns好友推荐取差集推荐。
1.向集合中添加元素。(sadd)查看集合元素(smembers)
1127.0.0.1:6379> sadd myset one 2(integer) 1 3127.0.0.1:6379> sadd myset two 4(integer) 1 5127.0.0.1:6379> sadd myset one 6(integer) 0 7127.0.0.1:6379> smembers myset 81) "two" 92) "one"
2.删除集合中元素(srem)
1127.0.0.1:6379> srem myset one 2(integer) 1
3.随机返回并删除一个元素(spop)
1127.0.0.1:6379> smembers myset 21) "two" 32) "three" 43) "one" 5127.0.0.1:6379> spop myset 6"one"
4.返回两个集合的差集(sdiff)以第一个为标准(可以做sns好友推荐)
1127.0.0.1:6379> smembers myset 21) "two" 32) "three" 4127.0.0.1:6379> smembers myset1 51) "two" 62) "lll" 73) "kkk" 8127.0.0.1:6379> sdiff myset myset1 91) "three" 10127.0.0.1:6379> sdiff myset1 myset2 111) "two" 122) "lll" 133) "kkk"
5.返回两个集合的差集并存储(sdiffstore)
1127.0.0.1:6379> sdiffstore myset2 myset1 myset 2(integer) 2
6.返回所有给定key的交集(sinter)以及存储(sinterstore)
1127.0.0.1:6379> sinter myset1 myset2 21) "lll" 32) "kkk" 4127.0.0.1:6379> sinter myset1 myset2 myset 5(empty list or set) 6127.0.0.1:6379> sinterstore myset4 myset1 myset2 7(integer) 2 8127.0.0.1:6379> smembers myset4 91) "lll" 102) "kkk"
7.返回所有给定key的并集(sunion)以及存储(sunionstore)
1127.0.0.1:6379> sadd myset1 myset1 2(integer) 1 3127.0.0.1:6379> sadd myset2 myset2 4(integer) 1 5127.0.0.1:6379> sunionstore myset myset1 myset2 6(integer) 2 7127.0.0.1:6379> smembers myset 81) "myset2" 92) "myset1" 10127.0.0.1:6379>
8.从第一个key对应的set中移除member并添加到第二个set中(smove)
1127.0.0.1:6379> smove myset1 myset2 myset1 2(integer) 1 3127.0.0.1:6379> smembers myset1 4(empty list or set) 5127.0.0.1:6379> smembers myset2 61) "myset2" 72) "myset1"
9.返回名称为key集合中元素的个数(scard)判断某元素是否为集合元素(sismember)
1127.0.0.1:6379> scard myset 2(integer) 2 3127.0.0.1:6379> smembers myset 41) "myset2" 52) "myset1" 6127.0.0.1:6379> sismember myset myset 7(integer) 0 8127.0.0.1:6379> sismember myset myset1 9(integer) 1
10.随机删除名称为key的set的一个元素,不删除(srandmember)
1127.0.0.1:6379> srandmember myset 2"myset1" 3127.0.0.1:6379> srandmember myset 4"myset2" 5127.0.0.1:6379> srandmember myset 6"myset2"
5.有序结合(zset)
sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加元素时可以指定,每次指定后,zset会自动重新按照新的值调整顺序。
1.向有序集合中添加元素(zadd)
1127.0.0.1:6379> zadd myset 1 one 2(integer) 1 3127.0.0.1:6379> zadd myset 2 two 4(integer) 1 5127.0.0.1:6379> zadd myset 3 two 6(integer) 0 7127.0.0.1:6379> zrange myset 0 -1 withscores 81) "one" 92) "1" 103) "two" 114) "3"
-
删除名称为key的zset中元素的member(zrem)
127.0.0.1:6379> zrem myset one (integer) 1 127.0.0.1:6379> zrange myset 0 -1
- "two"
3.如果在名称为key的zset中已经存在元素member,则该元素的score增加increment,否则向该集合中添加该元素,其score的值为increment(zincrby)
1127.0.0.1:6379> zincrby myset 2 one 2"4" 3127.0.0.1:6379> zrange myset 0 -1 withscores 41) "two" 52) "3" 63) "one" 74) "4" 8127.0.0.1:6379> zincrby myset -2 one 9"2"
4.返回名称为key的zset中member元素的排名(按score从小到大排序[下标]值)(zrank)以及反转(zrevrank)降序
1127.0.0.1:6379> zrange myset 0 -1 withscores 21) "one" 32) "2" 43) "two" 54) "3" 6127.0.0.1:6379> zrank myset two 7(integer) 1 8127.0.0.1:6379> zrevrank myset one 9(integer) 1
-
zrangebyscore
127.0.0.1:6379> zrangebyscore myset 2 2 withscores
- "one"
- "2"
6.返回集合中score在给定区间的数量(zcount)
1127.0.0.1:6379> zcount myset 2 5 2(integer) 2
7.返回集合中元素个数
1127.0.0.1:6379> zcount myset 2 5 2(integer) 2
8.返回集合中所有元素个数(zcard)
1127.0.0.1:6379> zcard myset 2(integer) 2
9.删除集合中排名在给定区间的元素(zremrangebyrank)(zremrangebyscore)
1127.0.0.1:6379> zrange myset 0 -1 withscores 21) "one" 32) "2" 43) "two" 54) "3" 65) "five" 76) "5" 8127.0.0.1:6379> zremrangebyrank myset 2 2 9(integer) 1 10127.0.0.1:6379> zrange myset 0 -1 111) "one" 122) "two" 13127.0.0.1:6379> zremrangebyscore myset 2 2 14(integer) 1 15127.0.0.1:6379> zrange myset 0 -1 161) "two"
键值相关命令:
1.keys * 得到所有键
2.exists 是否存在键
3.del 删除key
-
expire 设置一个key过期时间(ttl查看过期时间)移除key的过期时间(persist)
127.0.0.1:6379> set age 20 OK 127.0.0.1:6379> 127.0.0.1:6379> expire age 10 (integer) 1 127.0.0.1:6379> ttl age (integer) 8 127.0.0.1:6379> ttl age (integer) -2 127.0.0.1:6379> get age (nil) 127.0.0.1:6379[1]> set age 20 OK 127.0.0.1:6379[1]> expire age 20 (integer) 1 127.0.0.1:6379[1]> persist age (integer) 1
5.移动数据库
1127.0.0.1:6379> select 0 2OK 3127.0.0.1:6379> set age 20 4OK 5127.0.0.1:6379> get age 6"20" 7127.0.0.1:6379> move age 1 8(integer) 1 9127.0.0.1:6379> get age 10(nil) 11127.0.0.1:6379> select 1 12OK 13127.0.0.1:6379[1]> get age 14"20"
6.随机返回一个key(randomkey)
1127.0.0.1:6379> randomkey 2"posts:count" 3127.0.0.1:6379> randomkey 4"post:43" 5127.0.0.1:6379> randomkey 6"post:content"
7.重命名key(rename )
1127.0.0.1:6379> rename key2 key_new 2OK
8.返回值的类型(type)
1127.0.0.1:6379> type post 2string 3127.0.0.1:6379> type car 4hash 5127.0.0.1:6379> type list 6none 7127.0.0.1:6379> type myset 8zset 9127.0.0.1:6379> type mylist 10list
9.测试服务是否存活 (ping) 打印显示 (echo)退出(quit)
1127.0.0.1:6379> ping 2PONG
10.返回当前数据库中key的数目(dbsize)服务器信息(info)
1127.0.0.1:6379> dbsize 2(integer) 22 3127.0.0.1:6379> info 4# Server 5redis_version:3.0.0 6redis_git_sha1:00000000 7redis_git_dirty:0 8redis_build_id:3946449f969be394 9redis_mode:standalone
11.实时存储收到的请求(config get [*] )
12.删除当前选择数据库中的所有key(flushdb)
13.清除所有数据库所有key(flushall)
redis高级应用
1.安全性(设置连接密码,尽量复杂,放置暴力破解,[每分钟可达到150w次密码尝试])
1.在redis.conf中设置requirepass 123456
2.redis-cli 中连接1. ./redis-cli -a 123456 2. ./redis-cli –>auth
2.主从复制
1.redis主从复制特点
1.Master可以复制多个slave
2.多个slave可以连接同一个master,还可以连接其他slave
3.主从复制不会阻塞master,在同步数据时,master可以继续处理client。
4.提高系统的伸展性
2.配置主从服务器:
1.在slave中redis.conf开启slaveof 192.168.1.1 6379
2.masterauth 123456
3.info 查看主从(role)
3. 事务处理(multi)不回滚
1.开启事务multi
2.取消事务discard
[注]乐观锁:大多数是基于数据版本的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个version字段来实现读取数据时,将此版本号一同读出,之后更新时,对此版本号加1。此时,将提交数据的版本号与数据库表对应纪录的当前版本号进行比对,如果提交的数据版本号大于数据库当前版本号,则予以更新,否则认为过期数据。[版本控制器]
3.持久化机制
redis是一个支持持久化的内存数据库,redis需要经常讲内存中的数据库同步到硬盘来保持持久化。
redis持久化有两种:
1.snapshootting(快照,默认dump.rdb,数据)
save 900 1 #900秒如果超过1个key被修改,发起快照保存
save 300 10 #300秒内容如超过10个key被修改,发起保存快照
2.append-only file(缩写aof,操作)
1 appendonly yes//启用aof模式 2 #appendfsync always //收到写命令立即写入磁盘,完全持久话 3 appendonly everysec//每秒写入磁盘一次,在性能上折中 4 #appendfsync no//依赖os 性能最好,持久化没保证
3.发布与订阅消息(publish & subscribe)
1client 1 2127.0.0.1:6379> subscribe tv1 3client 2 4127.0.0.1:6379> subscribe tv1 5 6client 3 7127.0.0.1:6379> publish tv1 qwe 8(integer) 2 9 10127.0.0.1:6379> subscribe tv1 11Reading messages... (press Ctrl-C to quit) 121) "subscribe" 132) "tv1" 143) (integer) 1 151) "message" 162) "tv1" 173) "qwe"
4.虚拟内存的使用
redis的虚拟内存和操作系统虚拟内存不一样,是把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。
1.配置
vm-enabled yes #开启vm功能
vm-swap-file /tmp/redis.swap #交换出来的value保存文件路径
vm-max-memory 100000 #redis使用最大内存上线
vm-page-size 32 #每个页面大小32字节
vm-pages 134217728 #最多使用多少页面
vm-max-threads 4 #用于执行value对象换入的工作线程数量
really-use-vm yes
版权声明:本文为博主原创文章,未经博主允许不得转载。