# Fetch with automatic cachedefexpensive_calculationRails.cache.fetch('expensive_result', expires_in:1.hour) do# This block only runs on cache miss
perform_expensive_calculation
endend# Manual cache operationsRails.cache.write('key', 'value', expires_in:1.hour)
Rails.cache.read('key') # => "value"Rails.cache.delete('key')
# spec/rails_helper.rbRSpec.configure do |config|
config.before(:each) doRedis.current.flushdb
endend# Or use mock_redis gem
gem 'mock_redis'# In tests
let(:redis) { MockRedis.new }
Ruby & Rails Integration
Connect to Arctickey from Ruby applications using redis-rb.
Installation#
# Gemfile gem 'redis', '~> 5.0'bundle installQuick Start#
require 'redis' redis = Redis.new( url: 'rediss://:YOUR_PASSWORD@YOUR_INSTANCE.eu.arctickey.com:6379', ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_PEER } ) # Test connection redis.ping # => "PONG" # Basic operations redis.set('key', 'value') redis.get('key') # => "value" redis.setex('temp', 60, 'expires in 60 seconds')Rails Configuration#
Redis Cache Store#
# config/environments/production.rb config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'], ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_PEER }, connect_timeout: 5, read_timeout: 1, write_timeout: 1, reconnect_attempts: 1 }# .env REDIS_URL=rediss://:YOUR_PASSWORD@YOUR_INSTANCE.eu.arctickey.com:6379Session Store#
# config/initializers/session_store.rb Rails.application.config.session_store :redis_store, servers: [ENV['REDIS_URL']], expire_after: 24.hours, key: '_myapp_session', ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_PEER }Sidekiq Integration#
# config/initializers/sidekiq.rb Sidekiq.configure_server do |config| config.redis = { url: ENV['REDIS_URL'], ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_PEER } } end Sidekiq.configure_client do |config| config.redis = { url: ENV['REDIS_URL'], ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_PEER } } endCreating Workers#
# app/workers/email_worker.rb class EmailWorker include Sidekiq::Worker sidekiq_options retry: 3, queue: 'default' def perform(user_id, template) user = User.find(user_id) UserMailer.send(template, user).deliver_now end end # Enqueue a job EmailWorker.perform_async(user.id, 'welcome') # Schedule for later EmailWorker.perform_in(1.hour, user.id, 'reminder')Rails Caching#
Fragment Caching#
<%# app/views/products/show.html.erb %> <% cache @product do %> <div class="product"> <h1><%= @product.name %></h1> <p><%= @product.description %></p> </div> <% end %>Low-Level Caching#
# Fetch with automatic cache def expensive_calculation Rails.cache.fetch('expensive_result', expires_in: 1.hour) do # This block only runs on cache miss perform_expensive_calculation end end # Manual cache operations Rails.cache.write('key', 'value', expires_in: 1.hour) Rails.cache.read('key') # => "value" Rails.cache.delete('key')Direct Redis Operations#
# config/initializers/redis.rb $redis = Redis.new( url: ENV['REDIS_URL'], ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_PEER } ) # Use anywhere in your app $redis.set('counter', 0) $redis.incr('counter') $redis.get('counter') # => "1"Data Structures#
Hashes#
redis.hset('user:1', 'name', 'Alice', 'email', 'alice@example.com') redis.hget('user:1', 'name') # => "Alice" redis.hgetall('user:1') # => {"name"=>"Alice", "email"=>"alice@example.com"}Lists#
redis.lpush('queue:tasks', 'task1') redis.lpush('queue:tasks', 'task2') redis.rpop('queue:tasks') # => "task1" redis.lrange('queue:tasks', 0, -1) # => ["task2"]Sets#
redis.sadd('tags', 'ruby', 'redis', 'rails') redis.smembers('tags') # => ["ruby", "redis", "rails"] redis.sismember('tags', 'ruby') # => trueSorted Sets#
redis.zadd('leaderboard', 100, 'player1') redis.zadd('leaderboard', 200, 'player2') redis.zrevrange('leaderboard', 0, 9, with_scores: true) # => [["player2", 200.0], ["player1", 100.0]]Pub/Sub#
# Publisher redis.publish('notifications', { event: 'new_order', id: 123 }.to_json) # Subscriber (run in separate process) redis.subscribe('notifications') do |on| on.message do |channel, message| data = JSON.parse(message) puts "Received: #{data}" end endConnection Pooling#
# Gemfile gem 'connection_pool' # config/initializers/redis.rb REDIS_POOL = ConnectionPool.new(size: 10, timeout: 5) do Redis.new( url: ENV['REDIS_URL'], ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_PEER } ) end # Usage REDIS_POOL.with do |redis| redis.set('key', 'value') endError Handling#
begin redis.get('key') rescue Redis::ConnectionError => e Rails.logger.error("Redis connection failed: #{e.message}") nil # Fallback rescue Redis::TimeoutError => e Rails.logger.error("Redis timeout: #{e.message}") nil endTesting#
# spec/rails_helper.rb RSpec.configure do |config| config.before(:each) do Redis.current.flushdb end end # Or use mock_redis gem gem 'mock_redis' # In tests let(:redis) { MockRedis.new }