拓薪教育-redis教程
- 格式:docx
- 大小:401.40 KB
- 文档页数:17
redis基本操作Redis是一种开源的内存型数据库,它的性能优异,特性非常强大,能够支持大量的数据结构,如字符串、哈希表、列表、集合和有序集合等。
它也被称为NoSQL(非关系型)数据库,因为它不需要严格的模式化结构。
Redis最常用于缓存,因为它可以支持大量的键值对,以及速度令人惊叹的存取速度。
Redis安装非常简单,用户可以选择在其官网下载最新版本,也可以从大多数Linux发行版的软件仓库安装Redis,比如Arch Linux 中的AUR和Ubuntu中的PPA。
安装完毕后,用户就可以进行Redis的基本操作了。
首先,需要打开一个Redis服务器的连接,可以使用redis-cli 工具,或利用任何一种Redis库管理器,比如phpredisadmin,redis desktop manager等。
当连接上Redis服务器之后,就可以开始使用基本操作了。
SET命令可以让用户在Redis中设置一个键值对。
它由以下语法组成:SET key value。
这里,key是设置的键,value是对应的值。
例如:SET user johnsmith,则设置user为johnsmith。
GET命令可以用来获取Redis中的数据。
它的使用方法也很简单,只要输入GET key,就可以获取到key对应的值。
比如:GET user,输出johnsmith。
EXPIRE命令可以设置一个key的过期时间。
这样可以让用户控制key的有效期,以免它过期又无法使用。
其语法为EXPIRE keyseconds,其中seconds为设置的过期时间,即以秒为单位,设置key 要在多少秒之内变成过期状态。
EXISTS命令可以检查一个key是否存在,返回值是0或1,即key不存在或key存在。
其语法为EXISTS key,比如:EXISTS user,如果user已存在,则返回1,否则返回0。
RENAME命令可以对已存在的key进行重命名。
redis 使用方法
Redis是一个高性能的键值存储系统,具有快速、稳定、可靠等特点。
它支持多种数据类型,如字符串、哈希、列表、集合和有序集合等。
Redis 除了基本的键值读写操作外,还提供了丰富的功能,如发布/订阅、事务处理、Lua 脚本等。
Redis 的安装和配置非常简单,可以通过官网下载二进制包或者源码进行安装。
安装完成后,可以通过启动 redis-server 命令来启动 Redis 服务。
Redis 的命令非常简单易学,可以通过 redis-cli 命令来进入Redis 的命令行界面,然后输入相应的命令即可完成对 Redis 的操作。
例如,使用 SET 命令可以将一个键值对存储到 Redis 中,使用GET 命令可以获取对应的值。
除了基本的键值读写操作外,Redis 还提供了许多功能强大的命令和功能,如事务处理、批量操作、管道操作、Lua 脚本等。
这些功能可以大大提高 Redis 的性能和操作效率。
Redis 还支持多种编程语言的客户端库,如 Python、Java、PHP 等,可以方便地集成到各种应用中。
总之,Redis 是一个高性能、功能强大的键值存储系统,可以广泛应用于各种场景中,如缓存、队列、计数器、排行榜等。
掌握 Redis 的使用方法,可以大大提高系统的性能和稳定性。
- 1 -。
Redis⼊门实战(6)-Redisson操作redisRedisson是⼀个在Redis的基础上实现的Java常驻内存数据⽹格(In-Memory Data Grid)。
它不仅提供了⼀系列的分布式的Java常⽤对象,还提供了许多分布式服务。
Redisson提供了使⽤Redis的简单、便捷的⽅法,官⽹地址为:https:///redisson/redisson/wiki/⽬录。
本⽂主要介绍使⽤Redisson操作redis,使⽤到的软件版本:Java 1.8.0_191、Redis 5.0.8、Redisson 3.13.2。
1、引⼊依赖<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.2</version></dependency>2、Redisson操作redispackage com.inspur.demo.general.redis;import org.junit.After;import org.junit.Before;import org.junit.Test;import org.redisson.Redisson;import org.redisson.api.*;import org.redisson.config.Config;import java.io.*;import java.util.concurrent.TimeUnit;/*** Redisson操作redis* Redisson除了提供同步接⼝外,还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接⼝。
* Redisson会序列化java对象然后保存到reids,所以通过redis命令⾏设置的值,Redisson来获取值会报错;通redis命令⾏获取Redisson设置的值前⾯会多出序列化相关的信息 */public class RedissonCase {private RedissonClient client;private RedissonReactiveClient reactiveClient;private RedissonRxClient rxClient;@Beforepublic void before() {Config config = new Config();//config.setCodec(new org.redisson.client.codec.StringCodec());eSingleServer().setAddress("redis://10.49.196.10:6379").setPassword("123456");client = Redisson.create(config);reactiveClient = Redisson.createReactive(config);rxClient = Redisson.createRx(config);}@Afterpublic void after() {client.shutdown();reactiveClient.shutdown();rxClient.shutdown();}/*** 通⽤对象桶,可以⽤来存放任类型的对象*/@Testpublic void bucket() throws Exception {//同步RBucket<String> bucket = client.getBucket("name");bucket.set("zhaoyun");System.out.println(bucket.get());//异步RBucket<String> bucket2 = client.getBucket("name2");bucket2.setAsync("赵云2").get();bucket2.getAsync().thenAccept(System.out::println);//ReactiveRBucketReactive<String> bucket3 = reactiveClient.getBucket("name3");bucket3.set("赵云3").block();bucket3.get().subscribe(System.out::println);//RxJava2RBucketRx<String> bucket4 = rxClient.getBucket("name4");bucket4.set("赵云4").blockingGet();bucket4.get().subscribe(System.out::println);Thread.sleep(1000 * 5);/*** ⼆进制流* 提供了InputStream接⼝和OutputStream接⼝的实现*/@Testpublic void stream() throws Exception {RBinaryStream stream = client.getBinaryStream("stream");stream.set("赵云".getBytes());OutputStream outputStream = stream.getOutputStream();outputStream.write("张飞".getBytes());InputStream inputStream = stream.getInputStream();ByteArrayOutputStream result = new ByteArrayOutputStream();byte[] b = new byte[1024];int len;while ((len = inputStream.read(b)) != -1) {result.write(b, 0, len);}System.out.println(result.toString());}@Testpublic void atomicLong() {RAtomicLong atomicLong = client.getAtomicLong("atomicLong");atomicLong.set(10);atomicLong.incrementAndGet();System.out.println(atomicLong);}/*** 限流器*/@Testpublic void rateLimiter() throws InterruptedException {RRateLimiter rateLimiter = client.getRateLimiter("rateLimiter");//初始化最⼤流速:每1秒钟产⽣5个令牌rateLimiter.trySetRate(RateType.OVERALL, 5, 1, RateIntervalUnit.SECONDS);for (int i = 0; i < 10; i++) {new Thread(new Runnable() {int i = 0;@Overridepublic void run() {while(true) {rateLimiter.acquire(1);System.out.println(Thread.currentThread() + "-" + System.currentTimeMillis() + "-" + i++); }}}).start();}Thread.sleep(1000 * 5);}/*** RList实现了java.util.List接⼝*/@Testpublic void list() {RList<String> list = client.getList("list");list.add("a");list.add("赵云");list.add("张飞");list.remove(1);System.out.println(list);}/*** RMap实现了java.util.concurrent.ConcurrentMap接⼝和java.util.Map接⼝* @throws Exception*/@Testpublic void map() throws Exception {RMap<String, String> map = client.getMap("map");map.put("name", "赵云");map.put("location", "常⼭");map.put("camp", "蜀");map.remove("location");map.forEach((key, value) -> {System.out.println("key=" + key + ",value=" + value);});}/*** RSet实现了java.util.Set接⼝* @throws Exception@Testpublic void set() {RSet<String> set = client.getSet("set");set.add("赵云");set.add("张飞");set.forEach(System.out::println);}/*** RQueue实现了java.util.Queue接⼝*/@Testpublic void queue() {RQueue<String> queue = client.getQueue("queue");queue.add("赵云");queue.add("张飞");System.out.println(queue.poll());System.out.println(queue.poll());}/*** 可重⼊锁 RLock实现了java.util.concurrent.locks.Lock接⼝*/@Testpublic void lock() throws InterruptedException {RLock lock = client.getLock("lock");for (int i = 0; i < 5; i++) {new Thread(() -> {lock.lock();try {System.out.println(Thread.currentThread() + "-" + System.currentTimeMillis() + "-" + "获取了锁"); Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}).start();}Thread.sleep(1000 * 5);}/*** Redisson的分布式RBitSetJava对象采⽤了与java.util.BiteSet类似结构的设计风格*/@Testpublic void bitSet() {RBitSet bitSet = client.getBitSet("bs");bitSet.expire(5, TimeUnit.DAYS);bitSet.set(0, true);bitSet.set(20, true);bitSet.set(96, true);System.out.println(bitSet.get(10));System.out.println(bitSet.get(20));}/*** Redisson利⽤Redis实现了Java分布式布隆过滤器(Bloom Filter)*/@Testpublic void bf() {RBloomFilter<String> bf = client.getBloomFilter("qq");if (!bf.isExists()) {bf.tryInit(150000000L, 0.05);bf.add("test");bf.expire(200, TimeUnit.SECONDS);}bf.add("https:///");bf.add("https:///");bf.add("https:///");System.out.println(bf.contains("https:///"));System.out.println(bf.count());}}3、Redisson配置package com.inspur.demo.general.redis;import org.junit.Test;import org.redisson.Redisson;import org.redisson.api.RBucket;import org.redisson.api.RedissonClient;import org.redisson.config.Config;/*** Redisson配置*/public class RedissonConfigCase {/*** 单Redis节点模式*/@Testpublic void singl() {Config config = new Config();eSingleServer().setAddress("redis://10.49.196.10:6379").setPassword("123456").setConnectionPoolSize(5)//连接池⼤⼩.setConnectionMinimumIdleSize(2)//最⼩空闲连接数.setDatabase(0);RedissonClient client = Redisson.create(config);RBucket<String> name = client.getBucket("name");System.out.println(name.get());}/*** 主从模式*/@Testpublic void masterSlave() {Config config = new Config();eMasterSlaveServers().setMasterAddress("redis://10.49.196.20:6379").addSlaveAddress("redis://10.49.196.21:6379").addSlaveAddress("redis://10.49.196.22:6379").setPassword("123456").setMasterConnectionPoolSize(5)//主节点连接池⼤⼩.setMasterConnectionMinimumIdleSize(2)//主节点最⼩空闲连接数.setSlaveConnectionPoolSize(5)//从节点连接池⼤⼩.setSlaveConnectionMinimumIdleSize(2)//从节点最⼩空闲连接数.setDatabase(0);RedissonClient client = Redisson.create(config);RBucket<String> name = client.getBucket("name");System.out.println(name.get());}/*** 哨兵模式*/@Testpublic void sentinel() {Config config = new Config();eSentinelServers().setMasterName("mymaster").addSentinelAddress("redis://10.49.196.20:26379").addSentinelAddress("redis://10.49.196.21:26379").addSentinelAddress("redis://10.49.196.22:26379").setPassword("123456").setMasterConnectionPoolSize(5)//主节点连接池⼤⼩.setMasterConnectionMinimumIdleSize(3)//主节点最⼩空闲连接数.setSlaveConnectionPoolSize(5)//从节点连接池⼤⼩.setSlaveConnectionMinimumIdleSize(3)//从节点最⼩空闲连接数.setCheckSentinelsList(false).setDatabase(0);System.out.println(eSentinelServers().getSentinelAddresses());RedissonClient client = Redisson.create(config);RBucket<String> name = client.getBucket("name");name.set("赵云");System.out.println(name.get());}/*** 集群*/@Testpublic void cluster() {Config config = new Config();eClusterServers().setScanInterval(1000 * 2).addNodeAddress("redis://10.49.196.20:7000", "redis://10.49.196.20:7001") .addNodeAddress("redis://10.49.196.21:7000", "redis://10.49.196.21:7001") .addNodeAddress("redis://10.49.196.22:7000", "redis://10.49.196.22:7001") .setPassword("123456").setMasterConnectionPoolSize(5).setMasterConnectionMinimumIdleSize(2).setSlaveConnectionPoolSize(5).setSlaveConnectionMinimumIdleSize(2);RedissonClient client = Redisson.create(config);RBucket<String> name = client.getBucket("name"); name.set("赵云");System.out.println(name.get());}}。
redis使用方法Redis是一款开源的高性能内存键值存储数据库,它支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合等。
Redis是一种非关系型数据库,它的特点是速度快、可扩展性好、数据持久化、应用场景广泛等。
本文将介绍Redis的使用方法,包括Redis的安装、配置、基本命令、数据结构、事务和持久化等方面。
通过本文的学习,读者可以了解Redis的基本使用方法,为使用Redis提供帮助。
一、Redis的安装Redis的安装可以通过源码编译安装或者使用包管理工具安装。
下面以Ubuntu为例,介绍Redis的安装过程。
1. 使用包管理工具安装Ubuntu系统可以通过apt-get命令安装Redis。
打开终端,输入以下命令:sudo apt-get updatesudo apt-get install redis-server安装完成后,可以通过以下命令查看Redis是否已经安装成功: redis-cli ping如果返回“PONG”表示Redis已经安装成功。
2. 源码编译安装如果需要使用最新版本的Redis,可以通过源码编译安装。
首先需要下载Redis的源码包,可以从Redis官网(https://redis.io/)下载最新版本的源码包。
下载完成后,解压源码包,进入解压后的文件夹,执行以下命令进行编译和安装:makemake install安装完成后,可以通过以下命令启动Redis服务:redis-server二、Redis的配置Redis的配置文件是redis.conf,它包含了Redis的各种配置选项。
在Ubuntu系统中,配置文件位于/etc/redis/redis.conf。
下面介绍一些常用的Redis配置选项。
1. bindbind选项指定Redis监听的IP地址,如果不指定,Redis将监听所有的IP地址。
可以通过以下命令指定Redis监听的IP地址: bind 127.0.0.12. portport选项指定Redis监听的端口号,默认为6379。
redis hash使用方法Redis是一款高性能的键值存储数据库,其中的Hash类型是非常常用且强大的数据结构之一。
本文将详细介绍Redis Hash的使用方法。
Redis Hash是一个键值对集合,适用于存储对象。
其中,键是唯一的,而值则可以是字符串、整数或浮点数。
Hash类型主要用于存储对象的属性信息,如用户信息、商品信息等。
使用Redis Hash的第一步是创建一个Hash对象。
可以使用Redis 的`HSET`命令来设置Hash对象的字段和值。
例如,要存储一个用户对象的信息,可以使用如下命令:```HSET user:1 name "John Doe"HSET user:1 age 30HSETuser:1email"*******************"```上述命令将创建一个名为`user:1`的Hash对象,并设置了三个字段:`name`、`age`和`email`,以及对应的值。
接下来,我们可以使用`HGET`命令来获取Hash对象的字段值。
例如,要获取用户的姓名,可以使用如下命令:```HGET user:1 name```上述命令将返回用户的姓名:"John Doe"。
除了使用`HGET`命令获取单个字段值外,还可以使用`HGETALL`命令一次性获取所有字段和对应的值。
例如,要获取用户的所有信息,可以使用如下命令:```HGETALL user:1```上述命令将返回一个包含所有字段和值的列表。
除了获取字段值外,还可以使用`HDEL`命令来删除Hash对象的字段。
例如,要删除用户的邮箱字段,可以使用如下命令:```HDEL user:1 email```上述命令将删除用户对象的邮箱字段。
除了单个字段的删除外,还可以使用`DEL`命令一次性删除整个Hash对象。
例如,要删除用户对象,可以使用如下命令:```DEL user:1```上述命令将删除名为`user:1`的Hash对象。
redis常用操作命令Redis是一种开源的高性能键值对数据库,具有快速、稳定、可靠的特点,常用于缓存、消息队列等场景。
下面是Redis常用操作命令:1. 字符串操作- SET key value:设置key对应的value值。
- GET key:获取key对应的value值。
- INCR key:将key对应的value进行加1操作。
- DECR key:将key对应的value进行减1操作。
- APPEND key value:将value追加到key对应的value值后面。
2. 哈希操作- HSET key field value:为哈希表key中的field字段设置值为value。
- HGET key field:获取哈希表key中field字段的value值。
- HGETALL key:获取哈希表key中所有的field和value值。
- HINCRBY key field increment:将哈希表key中的field字段的value值增加increment。
3. 列表操作- LPUSH key value:将value插入到key对应的列表的头部。
- RPUSH key value:将value插入到key对应的列表的尾部。
- LPOP key:删除并返回key对应的列表的头部元素。
- RPOP key:删除并返回key对应的列表的尾部元素。
- LRANGE key start stop:返回key对应的列表中指定范围内的元素。
4. 集合操作- SADD key member:向key对应的集合中添加一个元素。
- SMEMBERS key:返回key对应的集合中所有的元素。
- SISMEMBER key member:判断member是否是key对应的集合中的元素。
- SREM key member:从key对应的集合中删除一个元素。
5. 有序集合操作- ZADD key score member:向key对应的有序集合中添加一个元素,指定score值。
redis入门教程Redis是一种基于键值对的内存数据库,具有高性能、高可扩展性和丰富的数据结构。
本篇文章将介绍Redis的基本概念、使用方法和常见应用场景。
一、Redis简介Redis(Remote Dictionary Server)是一个开源的高性能键值对存储系统。
它最初由SalvatoreSanfilippo开发,后来由Redis Labs维护和推广。
Redis以其快速的读写速度和丰富的数据结构而受到广泛关注和应用。
二、Redis的数据结构Redis支持多种数据结构,包括字符串、列表、哈希表、集合和有序集合。
每种数据结构都有相应的命令可以进行读写操作。
例如,使用SET命令可以设置一个字符串键值对,使用GET命令可以获取字符串的值。
三、Redis的常见命令Redis的命令可以分为五大类:键值对操作、列表操作、哈希表操作、集合操作和有序集合操作。
下面列举一些常用命令:1. 键值对操作- SET key value:设置一个键值对- GET key:获取指定键的值- DEL key:删除指定的键值对2. 列表操作- LPUSH key value:将一个值插入到列表的头部- RPUSH key value:将一个值插入到列表的尾部- LPOP key:从列表的头部弹出一个值- RPOP key:从列表的尾部弹出一个值3. 哈希表操作- HSET key field value:设置哈希表中指定字段的值- HGET key field:获取哈希表中指定字段的值- HDEL key field:删除哈希表中指定字段的值4. 集合操作- SADD key member:将一个成员添加到集合中- SMEMBERS key:获取集合中的所有成员- SREM key member:从集合中移除一个成员5. 有序集合操作- ZADD key score member:将一个带有分数的成员添加到有序集合中- ZRANGE key start stop:按照分数从小到大的顺序返回指定范围的成员- ZREM key member:从有序集合中移除一个成员四、Redis的应用场景1. 缓存Redis具有快速读写速度和高效的内存管理机制,因此被广泛应用于缓存场景。
redis的使⽤及⽅法⼀、redis(1)、redis是⼀个key-value。
和Memcached类似,它⽀持存储的value类型相对更多,包括string(字符串)、list()、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
这些都⽀持push/pop、add/remove及取交集并集和差集及更丰富的操作,⽽且这些操作都是原⼦性的。
在此基础上,redis⽀持各种不同⽅式的排序。
与memcached⼀样,为了保证效率,数据都是缓存在内存中。
区别的是redis会周期性的把更新的数据写⼊磁盘或者把修改操作写⼊追加的记录⽂件,并且在此基础上实现了master-slave(主从)同步。
View Code(2)、redis的⽤途a、redis可以做缓存b、redis可以做消息队列(3)、redis的本质a、将数据保存到内存中(4)、redis特性a、可做持久化b、⽀持存放数据格式多(5种格式){"k1": "oldboyedu"# "666" 字符串"k2": [11,22,33,44,11], 列表"k3": {11,22,33,44},"k4": {"n1":'xxx',"n2":"iii",'k1':'v1','k2': 'v2','num': 1,}, # 迭代取值"k5": {(11,1),("alex",5)}}⼆、redis的安装和基本使⽤a、下载解压wget http://download.redis.io/releases/redis-3.0.6.tar.gztar xzf redis-3.0.6.tar.gzcd redis-3.0.6makeb、启动服务端src/redis-serverc、启动客户端src/redis-cliredis> set foo barOKredis> get foo"bar"d、安装包yum install redis启动:/etc/init.d/redis start配置:/etc/redis/redis.confe、如果不⼩⼼把没有把redis退出,把开启redis的界⾯关了,那么⽤下⾯的代码:找服务并杀掉:ps -e|grep rediskill -9 端⼝号三、Python操作redis(1)、远程操作redis的模块(socket)sudo pip install redisorsudo easy_install redisor源码安装详见:https:///WoLpH/redis-py(2)、string操作a、set(name, value, ex=None, px=None, nx=False, xx=False)在Redis中设置值,默认,不存在则创建,存在则修改参数:ex,过期时间(秒)px,过期时间(毫秒)nx,如果设置为True,则只有name不存在时,当前set操作才执⾏xx,如果设置为True,则只有name存在时,岗前set操作才执⾏b、setnx(name, value)设置值,只有name不存在时,执⾏设置操作(添加)c、setex(name, value, time)# 设置值# 参数:# time,过期时间(数字秒或 timedelta对象)d、psetex(name, time_ms, value)# 设置值# 参数:# time_ms,过期时间(数字毫秒或 timedelta对象)e、mset(*args, **kwargs)批量设置值如:mset(k1='v1', k2='v2')或mget({'k1': 'v1', 'k2': 'v2'})f、get(name)获取值g、mget(keys, *args)批量获取如:mget('ylr', 'wupeiqi')或r.mget(['ylr', 'wupeiqi'])h、getset(name, value)设置新值并获取原来的值j、getrange(key, start, end)# 获取⼦序列(根据字节获取,⾮字符)# 参数:# name,Redis 的 name# start,起始位置(字节)# end,结束位置(字节)# 如: "黎明" ,0-3表⽰ "黎"k、setrange(name, offset, value)# 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)# 参数:# offset,字符串的索引,字节(⼀个汉字三个字节)# value,要设置的值l、setbit(name, offset, value)# 对name对应值的⼆进制表⽰的位进⾏操作# 参数:# name,redis的name# offset,位的索引(将值变换成⼆进制后再进⾏索引)# value,值只能是 1 或 0# 注:如果在Redis中有⼀个对应: n1 = "foo",那么字符串foo的⼆进制表⽰为:01100110 01101111 01101111所以,如果执⾏ setbit('n1', 7, 1),则就会将第7位设置为1,那么最终⼆进制则变成 01100111 01101111 01101111,即:"goo"# 扩展,转换⼆进制表⽰:# source = "李晓明"source = "foo"for i in source:num = ord(i)print bin(num).replace('b','')特别的,如果source是汉字"李晓明"怎么办?答:对于utf-8,每⼀个汉字占 3 个字节,那么"李晓明"则有 9个字节对于汉字,for循环时候会按照字节迭代,那么在迭代时,将每⼀个字节转换⼗进制数,然后再将⼗进制数转换成⼆进制 11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000-------------------------- ----------------------------- -----------------------------李晓明m、getbit(name, offset)# 获取name对应的值的⼆进制表⽰中的某位的值(0或1)n、bitcount(key, start=None, end=None)# 获取name对应的值的⼆进制表⽰中 1 的个数# 参数:# key,Redis的name# start,位起始位置# end,位结束位置o、bitop(operation, dest, *keys)# 获取多个值,并将值做位运算,将最后的结果保存⾄新的name对应的值# 参数:# operation,AND(并)、 OR(或)、 NOT(⾮)、 XOR(异或)# dest, 新的Redis的name# *keys,要查找的Redis的name# 如:bitop("AND", 'new_name', 'n1', 'n2', 'n3')# 获取Redis中n1,n2,n3对应的值,然后讲所有的值做位运算(求并集),然后将结果保存 new_name 对应的值中p、strlen(name)# 返回name对应值的字节长度(⼀个汉字3个字节)q、incr(self, name, amount=1)# ⾃增 name对应的值,当name不存在时,则创建name=amount,否则,则⾃增。
《Redis⼊门指南》.pdf
Redis在互联⽹技术存储⽅⾯使⽤⾮常⼴泛,⼏乎所有的后端技术⾯试官都要在Redis的使⽤和原理⽅⾯对⼩伙伴们进⾏360°的刁难。
想学习Redis,如何从⼩⽩变成⾼⼿呢?
Redis在开发领域的重要性不⾔⽽喻。
如果是⽩到发光⽩到透明的“⼩⽩”,想从开发的⼯作,想学redis,如何系统的学习呢?很多⼩伙伴曾经提出过这样的问题,于是我翻箱倒柜,找到了这本⾮常经典的电⼦书——《Redis⼊门指南》。
资料介绍
《Redis⼊门指南》由多位业界专家联合推荐,这是来⾃⼀线开发者的实战经验总结。
《Redis⼊门指南》深⼊浅出全⾯剖析Redis,实现真正零基础⼊门。
本书采⽤任务驱动式学习⽅式,让读者轻松掌握Redis实战知识。
对所有⼈来说,是⼀本对于学习和使⽤ Redis 来说不可多得的参考书籍。
超强、超详细Redis⼊门教程【转】这篇⽂章主要介绍了超强、超详细Redis⼊门教程,本⽂详细介绍了Redis数据库各个⽅⾯的知识,需要的朋友可以参考下【本教程⽬录】1.redis是什么2.redis的作者何许⼈也3.谁在使⽤redis4.学会安装redis5.学会启动redis6.使⽤redis客户端7.redis数据结构 – 简介8.redis数据结构 – strings9.redis数据结构 – lists10.redis数据结构 – 集合11.redis数据结构 – 有序集合12.redis数据结构 – 哈希13.聊聊redis持久化 – 两种⽅式14.聊聊redis持久化 – RDB15.聊聊redis持久化 – AOF16.聊聊redis持久化 – AOF重写17.聊聊redis持久化 – 如何选择RDB和AOF18.聊聊主从 – ⽤法19.聊聊主从 – 同步原理20.聊聊redis的事务处理21.教你看懂redis配置 – 简介22.教你看懂redis配置 -通⽤23.教你看懂redis配置 – 快照24.教你看懂redis配置 – 复制25.教你看懂redis配置 – 安全26.教你看懂redis配置 -限制27.教你看懂redis配置 – 追加模式28.教你看懂redis配置 – LUA脚本29.教你看懂redis配置 – 慢⽇志30.教你看懂redis配置 – 事件通知31.教你看懂redis配置 – ⾼级配置【redis是什么】redis是⼀个开源的、使⽤C语⾔编写的、⽀持⽹络交互的、可基于内存也可持久化的Key-Value数据库。
redis的官⽹地址,⾮常好记,是redis.io。
(特意查了⼀下,域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地)⽬前,Vmware在资助着redis项⽬的开发和维护。
【redis的作者何许⼈也】开门见⼭,先看照⽚:是不是出乎了你的意料,嗯,⾼⼿总会有些地⽅与众不同的。
拓薪教育-Redis教程讲师:任亮随笔- 17 文章- 3 评论- 168 高性能网站架构设计之缓存篇(1)- Redis的安装与使用一、什么RedisRE mote DI ctionary S erver,简称Redis,是一个类似于Memcached的Key-Value存储系统。
相比Memcached,它支持更丰富的数据结构,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型),并提供了数据持久化机制,在某些场景下,你完全可以把它当做非关系型数据库来使用。
它是一个高性能的存储系统,能支持超过100K+ 每秒的读写频率。
同时还支持消息的发布/订阅,从而让你在构建高性能消息队列系统时多了另一种选择。
二、下载点击这里下载。
我在这里下载的是redis-3.0.0-beta5版,redis从3.0开始支持集群。
三、安装以下安装均为OSX 操作系统上的步骤:1、找到你刚刚下载的redis-3.0.0-beta5.tar.gz文件,解压这个文件。
2、将解压后的文件夹拷贝到你很容易找到的目录下,并修改文件夹名为redis,因为版本号太长了。
2、打开终端,进入redis文件夹,命令如下:Last login: Fri May 30 21:33:25 on ttys000zhaoguihuadediannao:~ zhaogh$ cd applications/dev/rediszhaoguihuadediannao:redis zhaogh$3、在命令提示符出输入make 命令,稍等片刻,便能完成安装。
如果系统提示找不到make 命令,请参考这篇文章。
装好了,是不是有点小激动。
抽根烟,我们继续吧。
四、使用1、启动服务,先进入src 目录,然后执行redis-server。
zhaoguihuadediannao:redis zhaogh$ cd srczhaoguihuadediannao:src zhaogh$ ./redis-server你将会看到:2343:M 30 May 21:42:50.741 # Server started, Redis version 2.9.542343:M 30 May 21:42:50.741 * The server is now ready to accept connections on port 6379我没看错吧,TMD我明明下载的3.0.0,怎么显示Redis version 2.9.54 ? 好吧,这不是重点,我也懒得追究了。
6379 是redis 默认端口,在后续的文章中你将知道如何修改这个默认端口。
2、客户端连接。
你会发现在执行了第四步之后,我们无法再执行其他命令了,怎么办?因为redis独占了此进程,后面告诉你们如果将它修改为后台运行。
我们暂且再打开一个终端吧。
还是先进入src 目录:zhaoguihuadediannao:~ zhaogh$ cd applications/dev/redis/srczhaoguihuadediannao:src zhaogh$输入 ./redis-cli 命令:zhaoguihuadediannao:src zhaogh$ ./redis-cli127.0.0.1:6379>已经连接上了,哈哈哈。
3、测试几个redis 命令:127.0.0.1:6379> set testkey001 testkey001OK127.0.0.1:6379> get testkey001"testkey001"127.0.0.1:6379> append testkey001 aaa(integer) 13127.0.0.1:6379> get testkey001"testkey001aaa"127.0.0.1:6379>4、关闭连接,执行quit 命令127.0.0.1:6379> quitzhaoguihuadediannao:src zhaogh$5、关闭服务。
由于我们刚才已经退出了客户端,我们再次连接,并执行shutdown 命令:127.0.0.1:6379> shutdown127.0.0.1:6379>看看另外一个另外一个终端窗口中是不是显示 [进程已完成]。
当然,你也可以通过kill 命令来关闭服务。
今天就介绍这么多吧,下一篇你将看到如何使用c#客户端API操作redis。
随笔- 17 文章- 3 评论- 168 高性能网站架构设计之缓存篇(2)- Redis C#客户端在上一篇中我简单的介绍了如何利用redis自带的客户端连接server并执行命令来操作它,但是如何在我们做的项目或产品中操作这个强大的内存数据库呢?首先我们来了解一下redis的原理吧。
官方文档上是这样说的:Redis在TCP端口6379上监听到来的连接,客户端连接到来时,Redis服务器为此创建一个TCP连接。
意思就是redis的server端和client端是通过TCP/IP协议进行通信的,server默认在6379端口上监听客户端的连接,所以我们只需要通过TcpClient 类创建一个client,并主动去连接指定Host的6379端口就可以了。
TcpClient 创建一个连接应该还是一件比较容易的事情。
可是连上了之后怎么办?那么多的命令难道需要我们一个一个的去实现吗?那是一件多么令人头痛的事情啊,我们还是去找一个现成的吧,这是国人最愿意干的事情。
不用找了,哥给你们列了几个在下面:用哪个好呢?我也不知道,那就先试试第一个好了,ServiceStack可是除了不少好作品啊,如ServiceStack.OrmLite、ServiceStack.Text等。
先别急着去下载他,我们先建立个C#工程吧。
我的工程建好了,如图:然后通过NuGet获取ServiceStack.Redis,我这里获取的时4.0版,这个版本的免费版在某些功能上开始有限制了,看来有商业化的趋势。
添加好了,我们就可以直接用了。
打开Program文件,Main方法如下:1 public static void Main( string[] args )2 {3 const string HOST_IP = "127.0.0.1";45 using( var redis = new RedisClient( HOST_IP ) )6 {7 redis.FlushAll();89 redis.Set( "testkey001", "testvalue001" );1011 var value = redis.Get( "testkey001" );1213 Console.WriteLine( value );14 }1516 Console.ReadLine();17 }运行一下试试。
我勒个去,出异常了,could not connect to redis Instance at 127.0.0.1:6379,server 忘记打开了。
赶紧去打开终端执行一下 ./redis-server 命令,再运行一下,发现没有返回testvalue001,而是System.Byte[]。
是的,调用Get 方法返回的类型就是byte数组,ServiceStack.Redis 提供了另一个Get 方法的重载,要想返回string,我们只需要改成这样:var value = redis.Get<string>( "testkey001" );这次返回的结果就没错了。
ServiceStack.Redis 还提供了一系列的其他功能函数,都对应着Redis 命令,整个API 的命令还是比较规范的,一看方法名就能大致明白是什么意思,风格非常的restful。
关于其他函数的功能,我也不想一一列举了,网上一搜一大把,这些放一个连接供大家参考。
下一篇我将为大家介绍Redis 的配置。
随笔- 17 文章- 3 评论- 168高性能网站架构设计之缓存篇(3)- Redis 的配置我们说Redis是一个强大的Key-Value存储系统,在前面我们已遇到了两个问题:1、redis server 启动后,独占进程,能不能修改为后台服务呢?2、redis server 服务是单线程的,而我的机器是多核的,能不能在同一台机器上开启多个实例更充分的利用cpu 资源呢?但6379端口已经被前一个实例绑定,肯定会有冲突,那能不能修改默认端口呢?答案是肯定的,redis 提供了灵活的配置方式,一种可以通过配置文件来配置,另一种你可以在运行时通过config set 命令来修改配置。
我们先来看看配置文件吧。
殊不知我们在前面启动server 的时候敲的 ./redis-server 命令,如果后面不附加参数,它是按默认配置来启动redis 服务的,其实它后面还可以附加一个配置文件路径的参数。
这个配置文件在哪?在redis 根目录下有一个redis.conf文件,这个文件为了提供了默认的配置和示例。
你不要轻易去动这个文件,除非你非常牛逼。
我们还是保险起见先复制一个副本吧。
打开副本我们发现这个文件真的好大好长啊,全是英文看得我也难受啊,也不见哪座大神帮忙翻译一下,给个现成的中文版,太自私了吧,哥今天一晚不睡也要给你们一个交代。
太长了,翻译了一个晚上才搞了一部分出来,不过主要的配置项都翻译出来了,我后面有时间继续翻译。
看这里。
记得顺便去关注一下我的restful.data。
把这个文件下载下来后,拷贝到src 目录下面,也就是和redis-server 在同一个目录,方便我们操作。
我们稍微改一下配置,看看能不能把我们前面提到的两个问题解决了。
首先我们修改 daemonize 配置项,把它设置为yes,打开终端,我们执行一下redis-server 命令。
zhaoguihuadediannao:~ zhaogh$ cd applications/dev/redis/srczhaoguihuadediannao:src zhaogh$ ./redis-server ./redis.confzhaoguihuadediannao:src zhaogh$ ./redis-cli127.0.0.1:6379>是不是已经不再独占进程了,启动守护进程后,我们仍然可以执行redis-cli 命令。
先停掉redis 服务:127.0.0.1:6379> shutdown127.0.0.1:6379> quitzhaoguihuadediannao:src zhaogh$然后我们修改port 配置项为6378,然后再启动服务:zhaoguihuadediannao:src zhaogh$ ./redis-server ./redis.confzhaoguihuadediannao:src zhaogh$ ./redis-cliCould not connect to Redis at 127.0.0.1:6379: Connection refusednot connected>因为我们修改了默认端口号,已经连不上去了,尝试加上端口参数。