Ruby & Rails Integration

Connect to Arctickey from Ruby applications using redis-rb.

Installation#

Ruby
# Gemfile gem 'redis', '~> 5.0'
Terminal
bundle install

Quick Start#

Ruby
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#

Ruby
# 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 }
Terminal
# .env REDIS_URL=rediss://:YOUR_PASSWORD@YOUR_INSTANCE.eu.arctickey.com:6379

Session Store#

Ruby
# 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#

Ruby
# 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 } } end

Creating Workers#

Ruby
# 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#

ERB
<%# 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#

Ruby
# 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#

Ruby
# 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#

Ruby
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#

Ruby
redis.lpush('queue:tasks', 'task1') redis.lpush('queue:tasks', 'task2') redis.rpop('queue:tasks') # => "task1" redis.lrange('queue:tasks', 0, -1) # => ["task2"]

Sets#

Ruby
redis.sadd('tags', 'ruby', 'redis', 'rails') redis.smembers('tags') # => ["ruby", "redis", "rails"] redis.sismember('tags', 'ruby') # => true

Sorted Sets#

Ruby
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#

Ruby
# 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 end

Connection Pooling#

Ruby
# 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') end

Error Handling#

Ruby
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 end

Testing#

Ruby
# 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 }